Οι περισσότεροι χρήστες είναι συνήθως ανυπόμονοι και ειδικά όταν ο browser και η γραμμή του internet δεν τα πάνε και τόσο καλά μεταξύ τους ή ο server εκτελεί τον super-περίπλοκο αλγόριθμο που έχουμε σχεδιάσει, το αγαπημένο τους hobby είναι να προσπαθούν να σπάσουν το ρεκόρ των συνεχόμενων κλικ στο κουμπί που κάνει submit μέχρι τελικά ο browser να υποκύψει στις πιέσεις και να κάνει post τη φόρμα 2, 3 ή και 4 φορές (για τους πολύ γρήγορους)!
Σαν developers αυτό δεν είναι και από τα αγαπημένα μας σενάρια για άπειρους λόγους γιαυτό αναγκαζόμαστε να πάρουμε μέτρα και να ενημερώσουμε τον επίδοξο κάτοχο νέου ρεκόρ ταχύτητας κλικ πως όσο βαρετά και να είναι μερικά κλάσματα του δευτερολέπτου, δυστυχώς θα πρέπει να περιμένει. Και επειδή ξέρουμε πολύ καλά ότι δεν πρόκειται να μας δώσει σημασία αναγκαζόμαστε να πρέπει να απενεργοποιήσουμε το συγκεκριμένο κουμπί μετά το πρώτο κλικ.
Ο πρώτος τρόπος που μπορούμε να σκεφτούμε είναι να χρησιμοποιήσουμε το OnClientClick event του Button ή LinkButton κάπως έτσι:
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="this.disabled=true;this.value='Please wait...';" />
Αφού το δοκιμάσουμε όμως θα παρατηρήσουμε πως αυτό δουλεύει μόνο για το LinkButton που η λογική του postback βρίσκεται στο href tag (href="javascript:__doPostBack...") που αφήνουμε ανέπαφο. Το απλό Button ναι μεν απενεργοποιείται αλλά για αυτόν τον λόγο ο browser αρνείται να ξεκινήσει postback.
Υπάρχουν 2 απλές λύσεις σε αυτό το πρόβλημα:
1. Προσθέτουμε στο Button το property UseSubmitBehavior="false" που αναγκάζει το framework να προσθέσει των απαραίτητο κώδικα για το submit οπότε έχουμε το παρακάτω:
<asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="this.disabled=true" UseSubmitBehavior="false" />
2. Προσθέσουμε στο Page_Load μας την εξής γραμμή:
Button1.Attributes.Add("onclick", "this.disabled=true;this.value='Please wait...';" + ClientScript.GetPostBackEventReference(Button1, "").ToString())
Έτσι ένα άγχος λιγότερο για εμάς και ένα παιχνίδι λιγότερο για τους χρήστες!