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.
Approfondimenti
Implementare il throttling in ASP.NET Core
Load test di ASP.NET Core con k6
Usare ASP.NET Core dev tunnels per testare le applicazioni su internet
Short-circuiting della Pipeline in ASP.NET Core
Personalizzare l'errore del rate limiting middleware in ASP.NET Core
Cache policy su route groups di Minimal API in ASP.NET Core 7
Effettuare il deploy di immagini solo da container registry approvati in Kubernetes