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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Gestire progetti NPM in .NET Aspire
Gestione degli eventi nei Web component HTML
Introduzione ai web component HTML
Integrare un servizio esterno con .NET Aspire
Gestire codice JavaScript con code splitting e lazy loading
Fornire parametri ad un Web component HTML
Implementare il throttle in JavaScript
Gestire progetti .NET + React in .NET Aspire
Il nuovo controllo Range di Blazor 9
I più letti di oggi
- Accesso ai dati con Entity Framework Core 1
- Effettuare il refresh dei dati di una QuickGrid di Blazor
- vuoi scoprire tutte le novità per #wpdev in #wp81? iscriviti subito al nostro evento dell'08/07 a Milano! https://aspit.co/wp81-day
- #MAUI per sviluppare applicazioni #Windows e #XPlatf con #net5 con @leoncini117 Seguiteci live su #aspilive da https://aspit.co/ReBuild-20
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!
- #windowslive messenger web toolkit 3.5: performance migliorate, segnala via messenger e nuove feature! http://u.aspitalia.com/a2
- Aggiungere tag a una query con Entity Framework Core 2.2
- Usare il pattern matching in C# per verificare se un oggetto ha determinate caratteristiche