Thomas Bandt

Über mich | Kontakt | Archiv

Deaktivieren von Buttons - gar nicht so einfach

Das Szenario ist bekannt:

Der User klickt auf einen Button und schickt somit das Formular zum Server. Weil sich die Verarbeitung aber in die Länge zieht, vermutet er einen Fehler und klickt genervt immer wieder auf den Button.

Die Folge:

Durch den immer wieder ausgelösten PostBack, wird natürlich auch die Verarbeitung am Server immer wieder angestoßen. Dies kann besonders nervig und/oder gefährlich sein, wenn es sich zum Beispiel um Bestellungen in einem Warenkorb oder Benutzerregistrierungen handelt.

Die Lösung bisher:

Ein beliebtes Mittel um dem Einhalt zu gebieten war bisher, den Submit-Button im Formular per onSubmit-Event im Formular via JavaScript per

document.getElementById("buttonId").disabled = true;

zu deaktivieren. Dann sieht der Benutzer den Button zwar noch, kann ihn aber nicht mehr anklicken - er muss also warten, bis der Vorgang abgeschlossen ist, oder ganz abbrechen.

(Natürlich kann er noch F5 drücken und reloaden, aber das kann nicht verhindert werden, zumindest nicht solange der Vorgang nicht abgeschlossen ist - denn erst danach ist ein Redirect o.ä. möglich).

Das Problem:

Mit ASP.NET geht das nicht mehr. Der Grund: die Verschmelzung von Client- und Server-Objekten. Früher gab es ein HTML-Objekt, dessen Inhalte oder Attribute in einer Collection an den Server gesendet wurden. Heute, sprich mit ASP.NET, "existiert das Objekt sowohl am Client als auch am Server".

Deaktiviert man nun also den Button via JavaScript vor dem PostBack, so wird dieser Vorgang auch an den Server übermittelt.

Die Folge: ein evtl. auf diesem Button liegendes Event wird nicht mehr ausgelöst. Inaktiver Button = keine Aktionen damit.

Zitat: "Back in the days of classic ASP, when we wanted to prevent the end user from repeatedly mashing the submit button, we would disable the button with JavaScript. But with ASP.NET, it's not as simple as that anymore. When you disable any form element client side, you essentially disable it server side as well since its name value pair will not be sent with the form post. The drawback from this is that the button_click event is now rendered useless. It will never be raised!"

Die Lösung heute:

Es gibt keine. Zumindest keine hauseigene von ASP.NET Man kann sich aber dennoch Abhilfe verschaffen. Ich habe es insofern getan, als das ich den Button via JavaScript einfach ausgeblendet habe - denn diese Information wird nicht an den Server gesendet und ist somit nach dem RoundTrip zum Server wieder verschwunden, ermöglicht aber dennoch das gleiche: der User nicht mehr in der Lage den Button mehrfach zu klicken. Der Nachteil ist klar, die Sache wird etwas intransparenter.

Die wohl etwas elegantere, für mich aber mangels Zeitdruck nicht in Frage kommende, Lösung wäre wohl das "ClickOnce Button Server Control" von Eric Plowe.

http://www.codeproject.com/aspnet/ClickOnce_Button_Control.asp

(In den Kommentaren findet man auch eine C#-Version!)

Kommentare

  1. [teK] schrieb am Montag, 20. Februar 2006 17:33:00 Uhr:

    Oder schlicht und einfach nen onSubmit im form tag implementieren, anstelle 'nes onClick im input tag. ;)


« Zurück  |  Weiter »