Evitare postback multipli in un UpdatePanel

di Marco De Sanctis, in ASP.NET 2.0, ASP.NET 3.5, AJAX,

Capita spesso di gestire situazioni in cui click multipli su un button in pagina possono produrre effetti difficilmenti prevedibili. Il PageRequestManager, ossia il componente Javascript che si occupa della gestione dei postback asincroni, dà precedenza all'ultima richiesta pervenuta, cancellando eventuali altre in esecuzione. Purtroppo però, se queste ultime sono comunque pervenute al server, sono state in ogni caso processate e il risultato è spesso quello di ritrovarsi dati errati o record duplicati sulla base dati.

Il problema può essere gestito in vari modi, e uno di questi è quello di modificare tale comportamento di default con questo semplice snippet di codice Javascript:

<script type="text/javascript"><!--
    var prm;
    function pageLoad() {
        prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_initializeRequest(initializeRequest);
    }

    function initializeRequest(sender, args) {
        if (prm.get_isInAsyncPostBack()) {
            args.set_cancel(true);
        }
    }
--></script>

La funzione pageLoad ha un nome "riservato", e viene automaticamente invocata da ASP.NET AJAX al termine del caricamento della pagina. Al suo interno, viene recuperato il riferimento all'istanza del PageRequestManager e aggiunto un handler all'evento initializeRequest, che viene sollevato ogni volta che sopravviene una nuova richiesta di postback asincrono. In questo gestore, non dobbiamo far altro che verificare il valore della proprietà isInAsyncPostBack dello stesso PageRequestManager e, nel caso quest'ultimo sia già impegnato nell'esecuzione di un postback, cancellare la richiesta corrente.

L'esempio allegato contiene una pagina composta da una label che visualizza un contatore memorizzato in sessione, e un pulsante per incrementarlo. Si può notare come, abilitando e disabilitando questo script, il comportamento dell'applicazione in risposta a click multipli sia sensibilmente differente.

Questo semplice snippet di codice può essere tranquillamente aggiunto alla master page della nostra applicazione, in modo che tutte le pagine ne ereditino automaticamente i vantaggi. Va tuttavia detto che, in linea generale, non è corretto affidare alla sola logica lato client la consistenza delle operazioni lato server e che pertanto, anche su quest'ultimo, dovrebbero in ogni caso essere prese le eventuali contromisure per cui submit multipli non comportino errori funzionali.

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