Sapere in fase di Load quale controllo ha scatenato il postback è importante soprattutto quando creiamo controlli a runtime, poiché questi vanno creati nell'Init o nel Load, se si vuole usufruire degli eventi che questi dispongono.
La tecnica usata è quella di controllare il valore del campo nascosto __EVENTTARGET (__EVENTARGUMENT per ulteriori parametri) e verificare se è valorizzato con il ClientID del controllo in questione, in questo modo:
void Page_Load(object s, EventArgs e) { if (Request.Form["__EVENTTARGET"] == controllo.ClientID) { //operazioni da compiere } }
Questo però in alcuni casi non basta. Ci sono alcuni controlli che non sfruttano il campo nascosto ma che implementano comunque l'interfaccia IPostBackEventHandler, come i Button.
<asp:button runat="server" id="btn1" onclick="vai" text="ciao" /> <asp:button runat="server" id="btn2" onclick="vai" text="ciao2" />
Se guardiamo l'output HTML generato, avremo due tag input con un type="submit" e nessun codice script. Premendo su uno di questi pulsanti verrà valorizzata una variabile avente come name il ClientID del controllo e come valore il value del tag (la proprietà Text lato server in questo caso).
L'elaborazione di una richiesta è composta da vari passaggi:
- inizializzazione dei controlli (Init)
- caricamento del ViewState
- caricamento dei controlli (Load)
- scatenamento degli eventi attinenti il POST della form mediante l'interfaccia IPostBackDataHandler
- scatenamento dell'evento del controllo che ha generato il postback tramite l'interfaccia IPostBackEventHandler
Per quest'ultimo punto, il motore ASP.NET preleva ogni singolo campo della collezione Request.Form e verifica la presenza di un controllo avente ClientID uguale alla key del campo e che non implementi IPostBackDataHandler.
Terminata la verifica della collezione, prenderà questo controllo (se c'è) e richiamerà il suo metodo RaisePostBackEvent per poi andare a controllare finalmente il campo nascosto __EVENTTARGET.
Detto ciò, dobbiamo tenere in considerazione anche questo caso. Per registrare il controllo in questione viene richiamato il metodo pubblico e sovrascrivibile RegisterRequiresRaiseEvent (sempre della classe Page).
Non dobbiamo fare altro che sovrascriverlo e agire di conseguenza. Prendendo in considerazione l'esempio di prima, possiamo fare:
public override void RegisterRequiresRaiseEvent(IPostBackEventHandler control) { base.RegisterRequiresRaiseEvent(control); Response.Write(((Button)control).Text); }
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.