Impedire click multipli sul pulsante di submit

venerdì 24 marzo 2006 - 14.18

positron Profilo | Newbie

Ciao a tutti,
essendomi ritrovato nella situazione di voler impedire che l'utente clicchi piu' volte sul pulsante di submit di un form, mentre questo viene processato, vi propongo alcune riflessioni.

La prima soluzione che viene in mente e' quella di disabilitare il pulsante via Javascript una volta che il form viene inviato. In realta' ci sono alcuni fattori da prendere in considerazione.

E' ovvio che, qualunque sia la soluzione che si adotta client-side, questa non puo' essere considerata affidabile, visto che l'utente potrebbe avere disabilitato Javascript o realizzare il post in altri modi. Questo implica che se l'intenzione e' quella di implementare business logic rules, non si potra' fare a meno di gestire i click multipli anche server-side.

Cio' premesso, una interessante discussione sul modo migliore di risolvere il problema della disabalitazione del pulsante di submit e' disponibile qui:
http://aspzone.com/articles/207.aspx

Il fatto e' che la soluzione e' pensata per ASP.NET 1.x e non sembra essere sempre adatta per ASP.NET 2.0.

Inizialmente, nello scenario in cui mi sono ritrovato a implementarla non ne voleva sapere di funzionare, ma dopo un po' di analisi sono riuscito a scoprirne la ragione.

ASP.NET 2.0 introduce il concetto di ValidationGroup del quale avevo fatto innocentemente uso senza rendermi conto che era proprio questo a creare il problema.

Per farla breve, la soluzione proposta da John R. Lewis nella pagina al link sopraccitato prevede di inserire il seguente codice nel Page_Load:

System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("if (typeof(Page_ClientValidate) == 'function') { "); sb.Append("if (Page_ClientValidate() == false) { return false; }} "); sb.Append("this.value = 'Please wait...';"); sb.Append("this.disabled = true;"); sb.Append(this.Page.GetPostBackEventReference(this.Button1)); sb.Append(";"); this.Button1.Attributes.Add("onclick", sb.ToString());


dove Button1 fa riferimento al pulsante da disabilitare.

Dopo aver incollato questo codice nell'editor, VS2005 mi ha immediatamente informato del fatto che il metodo usato in
this.Page.GetPostBackEventReference(this.Button1)
e' obsoleto. Poco male, basta sostituirlo con
this.ClientScript.GetPostBackEventReference(this.Button1, "")

Cio' che e' piu' importante pero' e' che, nel caso in cui si usino i ValidationGroup occorre fare attenzione alla chiamata lato client
Page_ClientValidate()
in quanto questa restituisce il risultato della validazione di *tutta* la pagina. Fortunatamente e' sufficiente sostituire la riga
sb.Append("if (Page_ClientValidate() == false) { return false; }} ");
con

sb.Append("if (Page_ClientValidate('nomeGruppo') == false) { return false; }} ");

dove nomeGruppo e' evidentemente il nome del ValidationGroup cui il pulsante si riferisce.

Con questa semplice correzione il tutto sembra funzionare correttamente.
Spero questo sia utile a qualcuno.

Paolo Marini

arresto Profilo | Junior Member

Non era più semplice visualizzarfe una clessidra di atesa ed interdire disabled = true lato client il pulsante? Fatemi sapere cosa ne pensate

positron Profilo | Newbie

>Non era più semplice visualizzarfe una clessidra di atesa ed
>interdire disabled = true lato client il pulsante?

Il punto e' proprio questo. Se dai un'occhiata a quel link che ho citato ti rendi conto che e' meno semplice di quanto non appaia per le seguenti ragioni:
- inserire il codice client-side senza eliminare le funzionalita' del post-back;
- disabilitare il pulsante solo se la validazione ha avuto buon esito e il form verra' effettivamente postato;
- gestire correttamente la validazione del gruppo interessato, per via di questa nuova funzionalita disponibile in ASP.NET 2.0;

Ciao
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5