2010-06-29 9 views
5

Sto scrivendo un codice che imita l'effetto di creare un postback su una pagina eseguendo esattamente la stessa richiesta Web che verrebbe generata facendo clic su un pulsante che attiva il postback della pagina.Come fa una pagina di asp.net a sapere quale pulsante ha attivato un postback?

Il problema è che la risposta dalla richiesta web non è uguale a quella che ottengo quando si fa clic sul pulsante.

Durante gli accertamenti, vedo che anche se l'evento Page_Load viene attivato e gestito quando eseguo la richiesta Web, il gestore per il clic del pulsante non viene eseguito (ovvero l'evento non viene attivato o viene attivato ma non gestito - Immagino che sia più probabile il primo caso).

Quindi la mia domanda è - in che modo ASP.NET sa quale pulsante è stato cliccato in modo che possa richiamare il gestore appropriato?

Ho pensato che ciò fosse fatto usando il parametro __EVENTTARGET - ho impostato correttamente questo nel corpo del post della richiesta web, ma questo non ha fatto differenza.

Ho esaminato l'argomento __VIEWSTATE decodificato, ma non sono riuscito a vedere nulla di ovvio.

Qualcuno può fornire ulteriore aiuto?

EDIT: Giusto per essere chiari, io non chiedendo come aggiungere un gestore di clic per un'applicazione web.

Piuttosto, sto guardando un'applicazione che già ha un gestore di eventi click del pulsante, e voglio sapere come asp.net calcola da una richiesta web in entrata quale pulsante cliccare sul codice del gestore di eventi da richiamare.

+0

Puoi fornire maggiori dettagli su come stai effettuando il webquest? Usando il codice C# o jquery o javascript? Stai passando lungo _Viewstate insieme alla richiesta web? Che errore stai vedendo? –

+0

Sto usando C#. Quello che sto facendo è che sto facendo una richiesta iniziale a una pagina e recuperando un elemento __VIEWSTATE nella risposta. Quindi nella richiesta web generata per simulare il postback, trasmetto il valore di questo __VIEWSTATE. Non vedo un errore - tutto quello che vedo è quando inserisco un breakpoint sul codice server è che il codice per gestire il clic del pulsante sul server non viene chiamato. –

risposta

0

OK, così ho pensato questo fuori alla fine.

La richiesta deve contenere una coppia di valori nome, dove il nome è l'id del pulsante su cui è stato fatto clic e il valore può essere "1".

Ciò che mi ha lasciato perplesso è che nella richiesta generata facendo clic sul pulsante, non ho visto una coppia di valori di questo tipo. Davvero molto strano

Tuttavia, l'aggiunta di questa coppia di valori del nome alla mia richiesta Web creata ha causato l'attivazione del codice di gestione eventi del clic del pulsante.

0

Nel codice dietro, devi avere un evento per elaborare, e tale evento deve avere Handles ButtonName.Click

IE:

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click 
    ''# Process everything you want to process when Button2 gets clicked 
End Sub 

In alternativa, nel vostro pulsante è possibile avere OnClick impostato nel markup.

<asp:button ID="Button2" runat="server" OnClick="Button2_Click" Text="Click Me" /> 

perché il pulsante è impostato su runat="server", .NET farà tutto il lavoro pesante per voi.

+0

Hi Rockinthesixstring, come ho detto a Cylon Cat sopra, non voglio gestire l'evento click. Voglio solo capire perché l'evento click esistente non si attiva quando invoco una richiesta web identica alla richiesta che viene invocato con un clic del pulsante. Se sapessi che cosa esattamente asp.net cercava nella richiesta web per richiamare il codice del click hander, allora aggiungo questo alla richiesta web - da qui la mia domanda iniziale su come asp.net analizza la richiesta web che è inviato per capire quale gestore invocare. –

0

Esistono diversi modi semplici per creare un gestore di eventi per un pulsante. In modalità layout, fai doppio clic sul pulsante. Oppure, anche in modalità layout, selezionare il pulsante, aprire la finestra Proprietà, fare clic sull'icona "lightning bolt" e visualizzare un elenco di eventi che il controllo può attivare. Fai doppio clic sull'evento che desideri.

Quando si esegue una di queste operazioni, Visual Studio creerà il gestore eventi nel code-behind e collegherà l'evento.

Il gestore eventi del pulsante viene eseguito dopo il caricamento della pagina e dopo la convalida della pagina se si utilizzano i convalida ASP.NET.

+0

Ciao Cylon Cat, I ** non ** desidera creare un gestore di eventi per un pulsante. Piuttosto, voglio esercitare il codice del server in un'applicazione web che dovrebbe gestire un clic del pulsante. Voglio farlo richiamando una richiesta web identica alla richiesta web che viene generata quando si fa clic su un pulsante. Credo che farlo dovrebbe causare la chiamata al codice del click click del pulsante, ma ciò non sta accadendo. Quindi voglio sapere cosa asp.net cerca in una richiesta web per capire quale codice di evento deve essere invocato. –

+0

Le richieste Web vengono gestite in modo molto diverso dai clic sui pulsanti, quindi se si desidera trattarlo come una richiesta Web, è possibile procedere in due modi. Uno è usando i metodi Page, l'altro è creando un servizio web. Non ho usato i metodi Page, ma sono metodi AJAX-callable all'interno di una pagina, e avrete bisogno di un asp: tag ScriptManager che specifichi che userete i metodi Page. Se si crea un servizio Web, il codice del servizio verrà eseguito in sessione in ASP.NET e avrà accesso alle variabili di sessione. È possibile codificare un riferimento al servizio nell'asp: ScriptManager; che rende il servizio chiamabile da JavaScript –

1

Non posso rispondere alla tua domanda, ma posso dirti come scoprirlo.

Aggiungi una riga al tuo page_load: Request.SaveAs (@ "c: \ temp \ request.txt", true); (per un esempio).

Quindi fare clic sul pulsante per effettuare il postback.

Quindi leggere il contenuto di request.txt. C'è qualcosa di utile o interessante lì dentro?

+0

Grazie, Wozza. Ci provo e ti faccio sapere cosa scopro. –

0

Sembra che solo il valore __EVENTTARGET debba essere registrato con l'ID del pulsante che si desidera fare clic. È necessario impostare EnableEventValidation = "false" o ASP.NET genererà un errore. Guarda questo esempio. Semplice pagina html, post sulla pagina asp.net, simulando un clic del pulsante su quella pagina, che dovrebbe essere simile a quello che stai cercando di fare.

pagina HTML:

<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
    <form action="Default.aspx" method="post"> 
    <input value="cmdSubmit" name="__EVENTTARGET" type="hidden" /> 
    <input type="submit" value="submit" /> 
    </form> 
</body> 
</html> 

pagina ASP.NET con Pulsante per clic (Default.aspx):

<%@ Page Language="C#" EnableEventValidation="false" %> 
<script runat="server"> 

    protected void cmdSubmit_Click(object sender, EventArgs e) 
    { 
     litResult.Text = "Submit button clicked"; 
    } 
</script> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<body> 
    <form id="form1" runat="server"> 
    <asp:Literal ID="litResult" runat="server" EnableViewState="false"></asp:Literal> 
    <asp:Button UseSubmitBehavior="false" ID="cmdSubmit" EnableViewState="false" runat="server" 
     OnClick="cmdSubmit_Click" Text="Submit" /> 
    </form> 
</body> 
</html> 
+0

Chris, potrei generare il javascript - ma come risponderebbe la mia domanda su come asp.net sa come attivare un particolare codice di gestione degli eventi? –

+1

Mi sembra che javascript stia impostando il valore del campo nascosto __EVENTTARGET con l'ID del controllo su cui si fa clic e quindi inviando il modulo. Ma probabilmente c'è dell'altro, come forse il campo viewstate non può essere vuoto per indicare che si tratta di un postback. –

+0

Questo è un buon punto, Chris, ed è quello che pensavo. Ho controllato il campo __EVENTTARGET della richiesta che è stata generata facendo clic sul pulsante e aveva l'ID del pulsante su cui è stato fatto clic. Mi sono quindi assicurato che la mia richiesta avesse lo stesso valore __EVENTTARGET, ma questo non sembrava attivare il gestore di eventi click del pulsante. Quindi forse c'è dell'altro. Vorrei che qualcuno potesse gettare più luce qui ... –

5

In primo luogo, un pulsante ASP.NET <asp:button> rende come elemento <input type="submit" runat="server"...> della maschera. Con riferimento ai postback, questo pulsante si comporta in modo diverso rispetto ad altri controlli.

Quando si fa clic su <input type="submit"...> si attiva automaticamente un postback senza l'aiuto di ASP.NET (provarlo in un .htm). È possibile determinare quale pulsante è stato cliccato visualizzando i parametri del corpo POST. Il nome del pulsante e il suo valore (Prop. Testo) saranno inviati come parametri. __EVENTTARGET non è nell'immagine e dovrebbe essere nullo. Inoltre, ci sarà un solo pulsante di controllo nella lista dei parametri in base alle specifiche (quella che è stata cliccata). Quindi ora sai quale pulsante è stato cliccato.

Quindi a cosa serve __EVENTTARGET?

Altri controlli, come <asp:DropDownList> che restituiscono come SELECT, non attivano un postback quando si fa clic, ma semplicemente generano un evento javascript onChange. Se si desidera gestire l'evento sul lato server tramite l'evento SelectedIndexChanged, ASP.NET dovrà svolgere un lavoro aggiuntivo per l'utente. Se si imposta AutoPostBack = True per DropDownList, ASP.NET acquisirà l'evento onChange JS originale e collegherà una funzione __doPostBack JS personalizzata che è responsabile di compilare __EVENTTARGET e in modo esplicito inviando il modulo. È ora possibile determinare il controllo che ha attivato il postback esaminando __EVENTTARGET.

Spero che questo aiuti un po '!

Problemi correlati