Intercettare il PostBack di un controllo lato client

L’uso del PostBack in una pagina ASP.Net consente di inviare al server – attraverso la stessa pagina – un evento che indica che qualcosa è accaduto nella pagina stessa.
Questo meccanismo avviene tramite una funziona javascript che il framework aggiunge all’HTML della pagina generata e renderizzata nel browser e alla quale associa “il click” dei controlli server per i quali si vuole trasmettere informazioni al server affinchè quest’ultimo le processi.

Fintanto che questo meccanismo viene fatto attraverso controlli lato server, tutto funziona “magicamente” con del codice testato dal team di sviluppo di ASP.Net.

Quando però, per qualche ragione che non sto a sindacare, è necessario che a fare il postback sia un controllo lato client, bisogna fare in modo che il controllo client si agganci al meccanismo di PostBack e lato server se ne intercetti l’evento.

Come controllare il postback lato client?

A partire dalla versione 2.0 del framework è stato introdotto il metodo GetPostBackEventReference per la classe ClientScriptManager, che automaticamente genera quasi tutto il codice necessario per fare in modo che questo processo funzioni correttamente.

Si supponga per esempio che si vuole generare un link standard che faccia il PostBack. Potremmo scrivere qualcosa di questo tipo:

String.Format("Test", csm.GetPostBackEventReference(NomeDelControllo, ValoreDelPostBack));

Prendendo il risultato del Format e reindirizzandolo verso il corretto output.

Ovviamente dovremo prima creare un oggetto di tipo ClientScriptManager, che nel mio caso è csm, al quale passeremo un reference del codice javascript contenuto nella pagina con una sintassi come questa:

ClientScriptManager csm = Page.ClientScript;

Fatto questo, sarà possibile, premento sul link, intercettare il PostBack nella successiva chiamata alla pagina, nell’ormai noto evento OnLoad, con qualcosa di questo tipo:

if (Page.IsPostBack)
{
if (Page.Request.Form["__EVENTTARGET"] != "...."){
if (Page.Request.Form["__EVENTARGUMENT"] != string.Empty){
....
}
}
]

Technorati Tags: