C# - Submit gomb kétszeri lenyomásának megakadályozása

forráskód letöltése
Adott egy webes űrlap, melyet kitölt a felhasználó, majd az OK-ra kattint. Ekkor elindulnak az adatok az interneten a szerverünk és az ott található alkalmazás felé, mely elkezdi feldolgozni az adatokat, tárolja azokat, készíti a felhasználó felé küldendő HTML oldalt. E közben lehet, hogy már 5-10 esetleg még több másodperc is eltelik, mert épp lassú az átviteli sebesség a felhasználó gépe és szerverünk között. Ekkor a felhasználó csak várja, hogy történjen már valami, de mivel nem lát változást, így türelmetlenségében újra az OK gombra kattint és ekkor ismét elküldésre kerülnek az adatok szerverünkhöz, mely ismét feldolgozza ugyanazt az űrlapot. Ez sokszor nemkívánatos eseményekhez vezet: kétszer leadott megrendelés, két egyforma hozzászólás egy web fórumon, stb.
Ennek a problémának kivédésére keresünk megoldást mostani példánkban.
A megoldást abban találjuk meg, hogy amikor a felhasználó rákattint a gombra, akkor ott azonnal letiltjuk a gombot, majd csak ezután küldjük el az adatokat a szervernek, így nincs lehetősége egy újbóli kattintásra, ráadásul az egész egy kis script-tel megoldható.
Helyezzünk el egy HTML nyomógombot a Web Form-on, majd a HTML kódban az OnClick eseményéhez rendeljünk hozzá egy JavaScript függvényt, melynek most a submitform nevet adtuk.
    <form name="Form1" id="Form1" method="post" runat="server" onSubmit="submitform();return(false);">
      <INPUT name="submitbutton" onclick="submitform();return(false);" style="Z-INDEX: 103; LEFT: 200px; WIDTH: 106px; POSITION: absolute; TOP: 128px; HEIGHT: 24px" type="submit" value="OK">
    </form>
E függvény három dolgot tesz: az OK gomb feliratát a „Várjon...” feliratra cseréli, a gomb működését letiltja annak disabled property-jén keresztül, végül a Form Submit függvényének meghívásával szimulálja a gomb lenyomás hatását, vagyis az adatok elindulnak vissza a szerverünk felé.
    <script language="JavaScript">
      function submitform() {
        document.Form1.submitbutton.value = "Várjon... ";   
        document.Form1.submitbutton.disabled = true;
        document.Form1.submit();
      }
    </script>
Mivel a programot tesztelnünk is kell és ezt általában helyi gépen, vagy legalább helyi hálózaton tesszük, így itt olyan gyors válaszra számíthatunk, hogy észre sem vennénk a script hatását. Ezért a Page osztály Load eseményénél egy ciklust helyezünk el, melynek egyetlen haszna, hogy lassítja a válaszadást a kliens kérésére. Hogy a ciklus meddig fusson, az az aktuális gép sebességétől is függ. Lényeg az, hogy legalább 2-3 másodpercig eltartson a ciklus és ez idő alatt látható legyen a böngészőben a script hatása. Nyilván egy élesben működő alkalmazás esetén e ciklusra semmi szükség, hiszen ott lassító tényezőként maga az internet áll rendelkezésünkre.
    private void Page_Load(object sender, System.EventArgs e)
    {
      Label2.Text = (Convert.ToInt32(Label2.Text)+1).ToString();
      if (IsPostBack)
      {
        Int64 a = 0;
        for (Int64 i=0; i<200000000; i++)
        {
          a+=2;
        }
      }
      Label1.Text = TextBox1.Text;
    }