In certi casi puo' essere necessario impedire all'utente di premere piu' volte un pulsante: non c'e' un modo standard per farlo allora ho pensato di pacchettizzare alcune strategie trovate sul web sotto forma di due extension method per la classe Button.
Il primo applica solamente la disabilitazione (manetendo inalterate le validazioni eventualmente presenti sulla pagina), mentre il secondo permette di specificare ancheun testo di conferma prima di procedere col postback.
Verificate di avere una veriosne del framework uguale o superiore alla .NET 3.5 Service Pack 1, copiatevi questa classe nel progetto, e mettela in un namespace a volta scelta:
public static class ButtonExtender
{
public static void SetDisabledOnPostback(this Button button, String waitMessage)
{
StringBuilder sb = new StringBuilder();
sb.Append("if (typeof(Page_ClientValidate) == 'function') { ");
if (button.ValidationGroup == "")
sb.Append("if (Page_ClientValidate()");
else
sb.AppendFormat("if (Page_ClientValidate('{0}')", button.ValidationGroup);
sb.Append(" == false) { return false; }} ");
sb.AppendFormat("this.value = '{0}';", waitMessage);
sb.Append("this.disabled = true;");
button.UseSubmitBehavior = false;
button.OnClientClick = sb.ToString();
}
public static void SetDisabledOnPostbackWithConfirm(this Button button,
String waitMessage, String confirmText)
{
//disabilitazione standard
SetDisabledOnPostback(button, waitMessage);
//aggiunta della conferma
StringBuilder sb = new StringBuilder(button.OnClientClick);
sb.Insert(0, "if (confirm('" + confirmText + "') == false){return false;} ");
button.OnClientClick = sb.ToString();
}
}
A questo punto รจ sufficiente che nella pagina di interesse referenziate il namespace in cui avete messo la classe e nel page load lanciate:
this.myButton.SetDisabledOnPostback("Attendere prego...");
this.myButton.SetDisabledOnPostbackWithConfirm
("Attendere prego...", "Vuoi procedere ?");