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