Tengo varios div
s pequeños que utilizan jQuery
draggable. Estos mensajes de correo electrónico div
se colocan en un UpdatePanel
, y en dragstop utilizo la _doPostBack()
función JavaScript, donde extraigo la información necesaria del formulario de la página.
Mi problema es que cuando llamo a esta función, se vuelve a cargar toda la página, pero solo quiero que se vuelva a cargar el panel de actualización.
javascript
asp.net
webforms
updatepanel
postback
ErnieStings
fuente
fuente
Respuestas:
Aquí hay una solución completa
Etiqueta de formulario completo de la página asp.net
<form id="form1" runat="server"> <asp:LinkButton ID="LinkButton1" runat="server" /> <%-- included to force __doPostBack javascript function to be rendered --%> <input type="button" id="Button45" name="Button45" onclick="javascript:__doPostBack('ButtonA','')" value="clicking this will run ButtonA.Click Event Handler" /><br /><br /> <input type="button" id="Button46" name="Button46" onclick="javascript:__doPostBack('ButtonB','')" value="clicking this will run ButtonB.Click Event Handler" /><br /><br /> <asp:Button runat="server" ID="ButtonA" ClientIDMode="Static" Text="ButtonA" /><br /><br /> <asp:Button runat="server" ID="ButtonB" ClientIDMode="Static" Text="ButtonB" /> </form>
Todo el contenido de la clase de código subyacente de la página
Private Sub ButtonA_Click(sender As Object, e As System.EventArgs) Handles ButtonA.Click Response.Write("You ran the ButtonA click event") End Sub Private Sub ButtonB_Click(sender As Object, e As System.EventArgs) Handles ButtonB.Click Response.Write("You ran the ButtonB click event") End Sub
¿Que esta pasando?
Se representan dos controles de entrada al cliente:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
__EVENTTARGET
recibe el argumento 1 de __doPostBack__EVENTARGUMENT
recibe el argumento 2 de __doPostBackLa función __doPostBack se representa así:
function __doPostBack(eventTarget, eventArgument) { if (!theForm.onsubmit || (theForm.onsubmit() != false)) { theForm.__EVENTTARGET.value = eventTarget; theForm.__EVENTARGUMENT.value = eventArgument; theForm.submit(); } }
Cuando el formulario se envía / devuelve:
javascript:__doPostBack('ButtonB','')
, se ejecutará el controlador de clic de botón para ese botón.¿Qué sucede si no quiero ejecutar un controlador de clics, pero quiero hacer otra cosa en su lugar?
Puedes pasar lo que quieras como argumentos a
__doPostBack
Luego puede analizar los valores de entrada ocultos y ejecutar código específico en consecuencia:
If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then Response.Write("Do Something else") End If
Otras notas
ClientIDMode="Static"
, entonces usted puede hacer algo como esto:__doPostBack('<%= myclientid.UniqueID %>', '')
.__doPostBack('<%= MYBUTTON.UniqueID %>','')
fuente
Per Phairoh: use esto en la página / componente en caso de que el nombre del panel cambie
<script type="text/javascript"> <!-- //must be global to be called by ExternalInterface function JSFunction() { __doPostBack('<%= myUpdatePanel.ClientID %>', ''); } --> </script>
fuente
Si bien la solución de Phairoh parece teóricamente sólida, también he encontrado otra solución a este problema. Al pasar el ID de UpdatePanels como un parámetro (destino del evento) para la función doPostBack, el panel de actualización se publicará, pero no la página completa.
__doPostBack('myUpdatePanelId','')
* nota: el segundo parámetro es para argumentos de eventos adicionales
¡Espero que esto ayude a alguien!
EDITAR: entonces parece que este mismo consejo se dio anteriormente mientras escribía :)
fuente
Usar
__doPostBack
directamente es taaaan de la década de 2000. Cualquiera que codifique WebForms en 2018 usa GetPostBackEventReference(Más en serio, sin embargo, agregar esto como una respuesta para completar. Usar el
__doPostBack
directamente es una mala práctica (el prefijo de subrayado simple generalmente indica un miembro privado y el doble indica un miembro privado más universal), aunque probablemente no cambiará ni se volverá obsoleto en este punto. Tenemos un mecanismo totalmente compatible en ClientScriptManager.GetPostBackEventReference .)Suponiendo que su btnRefresh está dentro de nuestro UpdatePanel y causa una devolución de datos, puede usar GetPostBackEventReference así ( inspiración ):
function RefreshGrid() { <%= ClientScript.GetPostBackEventReference(btnRefresh, String.Empty) %>; }
fuente
Si alguien tiene problemas con esto (como yo), puede obtener el código de devolución de un botón agregando el atributo UseSubmitBehavior = "false". Si examina la fuente renderizada del botón, verá el javascript exacto que necesita ejecutar. En mi caso, estaba usando el nombre del botón en lugar de la identificación.
fuente
¿Ha intentado pasar el ID de cliente del panel de actualización a la función __doPostBack? Mi equipo ha hecho esto para actualizar un panel de actualización y, hasta donde yo sé, funcionó.
__doPostBack(UpdatePanelClientID, '**Some String**');
fuente
Primero, no use paneles de actualización. Son la segunda cosa más malvada que Microsoft haya creado para el desarrollador web.
Segundo, si debes utilizar paneles de actualización, intente establecer la propiedad UpdateMode en Condicional. Luego agregue un disparador a un Asp: control oculto que agregue a la página. Asigne el evento de cambio como desencadenante. En su evento dragstop, cambie el valor del control oculto.
Esto no está probado, pero la teoría parece sólida ... Si esto no funciona, puede intentar lo mismo con un botón asp:, simplemente configure el estilo display: none y use el evento click en lugar del evento change.
fuente
No puede llamar
_doPostBack()
porque fuerza la presentación del formulario. ¿Por qué no desactivas elPostBack
encendidoUpdatePanel
?fuente