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!
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- LINQ, lazy loading e architettura, l'11 marzo 2011 alle 18:42
- MetadataDiffViewer: aggiornato al .NET Framework 4.0, Silverlight 4.0 e Sharepoint 2010, il 7 gennaio 2010 alle 13:58
- .NET Framework 4.0 beta 1: Windows Communication Foundation, il 18 maggio 2009 alle 16:00
- Parallelizzare in Silverlight 2.0, il 21 aprile 2009 alle 00:25
- Silverlight: performance dell'isolated storage, il 16 aprile 2009 alle 17:38
- MetadataDiffViewer: differenze tra i framework, il 15 aprile 2009 alle 18:56