Sapere quale controllo ha scatenato il postback

di Cristian Civera, in .NET,

Molto spesso vedo richieste per sapere in fase di Load quale controllo ha scatenato il postback. Sapere questa informazione è importante soprattutto quando creiamo controlli a runtime poiché questi vanno creati o nel Init o appunto 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 paramentri) 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.
Per esempio:
<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 2 tag input con un type="submit" e nessun codice script. Quando premeremo 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). Successivamente il form sarà inviato al server. Queste due operazioni sono normalmente previste dall'html e non c'è nessuno script che interviene.

Ora la nostra classe Page ancora in fase di processo dei dati inviati (prima quindi di controllare il campo __EVENTTARGET), sta prelevando ogni singola key della collezione Request.Form. Quando trova un controllo avente come ClientID la key in questione e che non implementa IPostBackDataHandler, lo registra come controllo che deve scatenare un suo evento.

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);
}

Se avete dubbi...scrivetee!

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.

Nella stessa categoria
I più letti del mese