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
- El LinkButton se incluye para garantizar que la función javascript __doPostBack se muestre al cliente. El simple hecho de tener controles de botón no hará que se procese esta función __doPostBack. Esta función se representará en virtud de tener una variedad de controles en la mayoría de las páginas ASP.NET, por lo que normalmente no se necesita un botón de enlace vacío.
¿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 __doPostBack
La 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();
}
}
- Como puede ver, asigna los valores a las entradas ocultas.
Cuando el formulario se envía / devuelve:
- Si proporcionó el UniqueID del botón de control del servidor cuyo controlador de clic de botón desea ejecutar (
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
- ¿Qué sucede si no conozco el ID del control cuyo controlador de clics quiero ejecutar?
- Si no es aceptable para conjunto
ClientIDMode="Static"
, entonces usted puede hacer algo como esto: __doPostBack('<%= myclientid.UniqueID %>', '')
.
- O:
__doPostBack('<%= MYBUTTON.UniqueID %>','')
- Esto inyectará la identificación única del control en el javascript, si lo desea