Oto kompletne rozwiązanie
Cały tag formularza strony 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>
Cała zawartość klasy związanej z kodem strony
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
- Element LinkButton jest dołączony, aby zapewnić, że funkcja javascript __doPostBack jest renderowana do klienta. Samo posiadanie kontrolek Button nie spowoduje renderowania tej funkcji __doPostBack. Ta funkcja będzie renderowana ze względu na różnorodne kontrolki na większości stron ASP.NET, więc pusty przycisk linku zwykle nie jest potrzebny
Co się dzieje?
Klientowi są renderowane dwie kontrolki wejściowe:
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
__EVENTTARGET
otrzymuje argument 1 z __doPostBack
__EVENTARGUMENT
otrzymuje argument 2 z __doPostBack
Funkcja __doPostBack jest renderowana w następujący sposób:
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
- Jak widać, przypisuje wartości do ukrytych wejść.
Po przesłaniu formularza / ogłoszeniu zwrotnym:
- Jeśli podałeś UniqueID przycisku sterującego serwerem, którego moduł obsługi kliknięcia przycisku chcesz uruchomić (
javascript:__doPostBack('ButtonB','')
wówczas zostanie uruchomiony moduł obsługi kliknięcia przycisku dla tego przycisku.
Co jeśli nie chcę uruchamiać modułu obsługi kliknięć, ale zamiast tego chcę zrobić coś innego?
Możesz przekazać, co chcesz, jako argumenty __doPostBack
Następnie możesz przeanalizować ukryte wartości wejściowe i odpowiednio uruchomić określony kod:
If Request.Form("__EVENTTARGET") = "DoSomethingElse" Then
Response.Write("Do Something else")
End If
Inne notatki
- Co się stanie, jeśli nie znam identyfikatora kontrolki, której program obsługi kliknięć chcę uruchomić?
- Jeśli nie jest to możliwe do przyjęcia zestawu
ClientIDMode="Static"
, można zrobić coś takiego: __doPostBack('<%= myclientid.UniqueID %>', '')
.
- Lub:
__doPostBack('<%= MYBUTTON.UniqueID %>','')
- Spowoduje to wstrzyknięcie unikalnego identyfikatora kontrolki do javascript, jeśli sobie tego życzysz