Recuperare il control che ha effettuato il PostBack

di Cristian Civera, in UserScript, ASP.NET, Web Server Controls,

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

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi