2013-03-28 10 views
9

Ich habe ein <asp:Button /> Steuerelement verwendet, und nach dem Rendern im Browser hat dieses Steuerelement keine Ereigniseigenschaft click zugewiesen. Wie genau nennt es das Server Side Event?Wie wird die __doPostBack-Methode aufgerufen? Wo ist die rufende Methode?

ASPX Code:

<asp:Button ID="Button1" runat="server" Text="Button" OnClick="TestClickEvent" /> 

Die obige Steuerung wurde in Browser als folgender Code wiedergegeben:

<input type="submit" name="Button1" value="Button" id="Button1"> 

Der folgende Code wird in dem Browser dargestellt, die __EVENTTARGET setzt. Mein Zweifel ist, wie die __doPostBack Methode aufgerufen wird? Wo ist die rufende Methode?

function __doPostBack(eventTarget, eventArgument) { 
     if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
      theForm.__EVENTTARGET.value = eventTarget; 
      theForm.__EVENTARGUMENT.value = eventArgument; 
      theForm.submit(); 
     } 
    } 
+3

Zeigen Sie uns Ihren Code bitte –

+0

_ "nach dem Rendern im Browser" _ Ich denke, Sie verwirren Server-und Client-Code. –

+0

Ich denke, dass Sie dies lesen sollten http://support.microsoft.com/kb/306459 es erklärt Web Forms serverseitige Kontrollen. Im Wesentlichen werden Postbacks über Javascript ausgeführt, die versteckten Felder __EVENTTARGET und __VIEWSTATE enthalten Informationen darüber, was geklickt wurde bzw. welche Daten auf der Seite angezeigt werden.Die Szenen __EVENTTARGET usw. werden abgefragt und der entsprechende serverseitige Event-Handler aufgerufen. – bUKaneer

Antwort

12

Die einfache Antwort: Die __doPostBack JavaScript-Funktion auf der Grundlage spezifischer <asp /> Kontrollen genannt wird und die Ereignisse, die sie verarbeitet.

Die detaillierte Antwort: Es kommt darauf an.


Zunächst wollen wir Ihr Beispiel behandeln. Sie haben eine <asp:Button />, die als Standard <input type="submit" /> gerendert wird. Alles in ASP.NET WebForms dreht sich um den Standard HTML <form> Tag. Ein HTML <form> wird ohne die Verwendung oder Unterstützung von JavaScript durch Klicken auf eine Schaltfläche gesendet.

In diesem Sinne kann man sehr gut sehen (die Sie bereits bemerkt haben), dass die gerenderte <input type="submit" /> Taste funktioniert nicht haben ein onclick Ereignis zugeordnet. Und wie Sie sehen können, wird das Formular beim Klicken auf die Schaltfläche gesendet.

Wenn es darum geht, wie der Back-End-Code (C#/VB.NET/etc.) Ausgeführt wird, wenn die <input type="submit" />-Schaltfläche angeklickt wird: Es wird alles durch das ASP.NET Framework selbst behandelt und ist nicht im Rahmen von diese Frage/Antwort.


Zweitens jetzt wollen wir decken, was __doPostBack ist und wie es verwendet wird.__doPostBack ist einfach eine Hilfs-JavaScript-Funktion zum Übermitteln der HTML <form>. Aus den oben genannten Gründen wissen Sie jetzt, warum die <input type="submit" /> Schaltfläche nicht die __doPostBack Funktion aufrufen muss.

Der Einfachheit halber wollen wir auf einer ASP.NET-Seite einen Blick darauf werfen, die eine <asp:DropDownList /> Kontrolle hat, und es hat die SelectedIndexChanged Ereignishandler zugewiesen:

<asp:DropDownList ID="MyDropDownList" AutoPostBack="true" OnSelectedIndexChanged="MyDropDownList_SelectedIndexChanged" runat="server" /> 

Die <asp:DropDownList /> wie folgt wiedergegeben wird:

<select id="ctl00_MyDropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$MyDropDownList\',\'\')', 0)" name="ctl00$MyDropDownList"></select> 

Lassen Sie uns die setTimeout Funktion im onchange Ereignis ignorieren - es ist nur eine hacky Workaround von ASP.NET verwendet - und konzentrieren wir uns o n die __doPostBack Funktion innerhalb davon.

Wie man hier sehen kann, die __doPostBack Funktion ist vom Handler onchange Ereignis aufgerufen wird. Der Hauptunterschied besteht darin, dass die Änderung des Werts einer <asp:DropDownList /> oder <select /> Steuerung nicht dazu führt, dass der Browser das Formular abschickt!

Noch einmal behandelt das ASP.NET Framework intern, wie der Back-End-Code ausgeführt wird, wenn das Formular gesendet wird (ob über die __doPostBack-Funktion oder nicht).


Schließlich ist, wie für die Einzelheiten der __doPostBack: nimmt es zwei Parameter - eventTarget und eventArgument. eventTarget enthält die gerenderte HTML id -Eigenschaft des Steuerelements, das das Postback verursacht; und eventArgument ist ein optionaler Parameter, mit dem zusätzliche Daten an den Back-End-Code übergeben werden können.


bearbeiten Zusätzliche Information: die OP fragte eine sehr interessante Frage - was passiert, wenn es mehr als eine Submit-Button ist?

Nun, während einer POST Operation gehören Browser die value der <input type="submit" />, die den Vorgang verursacht zu initiieren.

Dies bedeutet, dass Sie genau wie Sie die Werte Ihrer <input /> Elemente erhalten, können Sie auch abfragen, für welche Schaltfläche das Senden verursacht hat!

+0

wow wirklich gemocht diese Erklärung, benutzte ASP.NET von den letzten 5 Jahren, aber versuchte nicht zu wissen, wie es wirklich in diesen Details arbeitet !!! – Ali

+1

Froh, dass es geholfen hat! :-D – Jesse

4

Ihre Kontrolle ist ein Submit-Button, kann sie direkt auf die Form an den Server senden, ohne die __doPostBack Methode aufrufen. In diesem Fall wird __dopostback nicht aufgerufen. __dopostback wird für Steuerelemente verwendet, die kein Standardübermittlungsverhalten haben, z. B. Dropdownliste.

Die Verbindung zu Ihrem serverseitigen Ereignis erfolgt über die von Ihrer Steuerung implementierte Schnittstelle ipostbackeventhandler. Für weitere Informationen schauen Sie bitte diese http://msdn.microsoft.com/en-us/library/system.web.ui.ipostbackeventhandler.raisepostbackevent.aspx

+0

ohne Aufruf der _dopostback-Methode, wie der __EVENTTARGET-Wert initialisiert wird. –

+0

Es wird nicht initialisiert und Sie brauchen es nicht, weil der Button das Formular direkt abgibt, nicht über _dopostback, das asp.net-Framework weiß, wer das Ereignis ausgelöst hat und es ruft die RaisePostBackEvent-Methode für die ipostbackeventhandler-Schnittstelle auf das Klickereignis des Knopfes – Atti

3

Nun, der Grund, warum Sie Zweifel haben, ist, weil Sie denken, dass die Funktion __doPostBack zum Posten benötigt wird. Aber es ist andersherum, als html zuerst entworfen wurde, war die einzige Möglichkeit, zurück zum Server zu posten, über den Submit-Button. Diese Funktionalität wurde im Browser selbst erstellt, so dass der Browser die Daten des Formulars an den angegebenen Ort übergab, wenn der Submit Button gedrückt wurde. Aber als das Web entwickelt wurde, forderten die Leute mehr. Jetzt müssen auch andere Steuerelemente zum Zurücksetzen auf den Server hinzugefügt werden. Um sie zu implementieren, wurden verschiedene Hacks entwickelt, die bekannteste __doPostBack-Funktion ist eine davon. Alle anderen Steuerelemente, die jetzt übermittelt werden, können mit der __doPostBack-Funktion zurückgesendet werden. Aber sende das selbst. Das ist alles.