2013-03-28 12 views
9

Ho utilizzato un controllo <asp:Button /> e dopo il rendering nel browser il controllo non ha una proprietà evento click assegnata. Come si chiama esattamente l'evento side side?come viene chiamato il metodo __doPostBack? Dov'è il metodo di chiamata?

codice ASPX:

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

Il controllo sopra è stata resa in browser come codice seguente:

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

Il codice seguente è resa nel browser, che definisce __EVENTTARGET. Il mio dubbio è come viene chiamato il metodo __doPostBack? Dov'è il metodo di chiamata?

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

Mostraci il tuo codice per favore –

+0

_ "dopo il rendering nel browser" _ Penso che tu stia confondendo il codice server e client. –

+0

Penso che dovresti leggere questo http://support.microsoft.com/kb/306459 spiega i controlli serveride di Web Form. In sostanza i postback sono fatti tramite javascript, i campi nascosti __EVENTTARGET e __VIEWSTATE contengono informazioni su ciò che è stato cliccato e i dati sulla pagina rispettivamente.Behine the scenes __EVENTTARGET ecc. Viene interrogato e viene chiamato il gestore di eventi sul lato server appropriato. – bUKaneer

risposta

12

La risposta è semplice: La funzione __doPostBack JavaScript viene chiamata in base a specifici controlli <asp />e gli eventi che essa gestisce.

La risposta dettagliata: Dipende.


Per prima cosa, copriamo il tuo esempio. Hai un <asp:Button /> che viene reso come standard <input type="submit" />. Tutto in ASP.NET WebForms ruota attorno al tag standard HTML <form>. Un codice HTML <form> viene inviato senza l'uso o l'assistenza di JavaScript tramite clic su un pulsante <input type="submit" />.

Con questo in mente, si può benissimo vedere (che si è già notato) che l'ha reso il tasto <input type="submit" /> fa non hanno un evento onclick assegnato. E, come puoi vedere, il modulo viene inviato quando si fa clic sul pulsante.

Quando si tratta del codice back-end (C#/VB.NET/etc.) Viene eseguito quando si fa clic sul pulsante <input type="submit" />: tutto viene gestito dallo stesso ASP.NET Framework ed è oltre lo scopo di questa domanda/risposta.


In secondo luogo, ora cerchiamo di coprire ciò che __doPostBack è, e come viene utilizzato.__doPostBack è semplicemente una funzione JavaScript di supporto utilizzata per inviare l'HTML <form>. A causa dei motivi illustrati sopra, ora sai perché il pulsante <input type="submit" /> fa non necessario chiamare la funzione __doPostBack.

Per semplicità, diamo uno sguardo a una pagina ASP.NET, che ha un controllo <asp:DropDownList />, e ha il gestore SelectedIndexChanged evento assegnato:

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

Il <asp:DropDownList /> è reso come segue:

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

ignoriamo la funzione setTimeout nell'evento onchange - è semplicemente una soluzione alternativa usata da ASP.NET - e concentriamoci su o n la funzione __doPostBack al suo interno.

Come si può vedere qui, la funzione di __doPostBackè essere chiamato dal gestore onchange eventi. La differenza principale è che la modifica del valore di un controllo <asp:DropDownList /> o <select />non causa l'invio del modulo da parte del browser!

Ancora una volta, ASP.NET Framework gestisce internamente il modo in cui il codice back-end viene eseguito quando viene inviato il modulo (tramite la funzione __doPostBack o meno).


Infine, per quanto riguarda i dettagli di __doPostBack: accetta due parametri - eventTarget e eventArgument. eventTarget contiene la proprietà HTML di rendering id del controllo che causa il postback; e eventArgument è un parametro facoltativo che può essere utilizzato per passare ulteriori dati al codice back-end.


Edit Informazione supplementare: l'OP ha fatto una domanda molto interessante - cosa succede quando v'è più di un pulsante di invio?

Bene, durante un'operazione POST, i browser includono lo value dello <input type="submit" /> che ha causato l'avvio dell'operazione.

Ciò significa che, come si ottengono i valori degli elementi <input />, è anche possibile chiedere quale pulsante ha causato l'invio!

+0

wow è piaciuto molto a questa spiegazione, ho usato ASP.NET negli ultimi 5 anni ma non ho provato a sapere come funziona effettivamente in questi dettagli !!! – Ali

+1

Felice di averlo aiutato! :-D – Jesse

4

Il controllo è un pulsante di invio, è possibile inviare direttamente il modulo al server senza chiamare il metodo __doPostBack. Quindi in questo caso __dopostback non viene chiamato. __dopostback è utilizzato per i controlli che non presentano un comportamento di invio predefinito, come dropdownlist.

Il cablaggio per l'evento lato server avviene tramite l'interfaccia ipostbackeventhandler implementata dal controllo. Per maggiori informazioni si prega di controllare questo http://msdn.microsoft.com/en-us/library/system.web.ui.ipostbackeventhandler.raisepostbackevent.aspx

+0

senza chiamare il metodo _dopostback, come il valore __EVENTTARGET viene inizializzato. –

+0

Non viene inizializzato e non è necessario, perché il pulsante invia il modulo direttamente, non tramite _dopostback, il framework asp.net sa chi ha generato l'evento e chiamerà l'interfaccia ipostbackeventhandler metodo RaisePostBackEvent, che lo collegherà a l'evento click del pulsante – Atti

3

Bene, la ragione per cui si hanno dubbi è perché si ritiene che la funzione __doPostBack sia necessaria per la pubblicazione. Ma è un altro modo, quando html è stato progettato per la prima volta, l'unico modo per inviare di nuovo al server era tramite il pulsante di invio. Questa funzionalità è stata creata nel browser stesso, in modo tale che, quando il pulsante di invio è stato premuto, il browser ha passato i dati del modulo alla posizione dichiarata. ma come il web ha sviluppato la gente ha iniziato a chiedere di più. Ora sono necessari anche altri controlli per inviare di nuovo al server. Per implementarli sono stati sviluppati vari hack, la funzione __doPostBack più nota è una di queste. qualsiasi altro controllo che invia ora può postare utilizzando la funzione __doPostBack. Ma invia il pulsante fai da te. È tutto.

Problemi correlati