2008-11-13 141 views
3

我試圖禁用一個按鈕,當用戶提交付款表單和代碼張貼表單導致在Firefox中的雙重職位。 當代碼被刪除時,不會發生此問題,並且在Firefox以外的任何瀏覽器中都不會發生此問題。提交後禁用按鈕

任何想法如何防止這裏的雙重職位?

System.Text.StringBuilder sb = new 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(Page.GetPostBackEventReference(btnSubmit)); 
sb.Append(";"); 
btnSubmit.Attributes.Add("onclick", sb.ToString()); 

它是造成問題的

感謝

的sb.Append(Page.GetPostBackEventReference(btnSubmit按鈕))線

編輯:這裏是按鈕的C#:

<asp:Button ID="cmdSubmit" runat="server" Text="Submit" /> 

這裏的html

這段代碼發佈兩次(並禁用提交按鈕並驗證輸入):

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" onclick="if (typeof(Page_ClientValidate) == 'function') { if (Page_ClientValidate() == false) { return false; }} this.value = 'Please wait...';this.disabled = true;document.getElementById('ctl00_MainContent_cmdBack').disabled = true;__doPostBack('ctl00$MainContent$cmdSubmit','');" id="ctl00_MainContent_cmdSubmit" /> 


此代碼的帖子兩次(但不會禁用提交按鈕):

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" onclick="__doPostBack('ctl00$MainContent$cmdSubmit','');" id="ctl00_MainContent_cmdSubmit" /> 


此代碼的帖子一次(但不會驗證用戶輸入並不會禁用提交按鈕):

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" id="ctl00_MainContent_cmdSubmit" /> 


此代碼的帖子一次(但不能禁用提交按鈕):

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContent$cmdSubmit&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="ctl00_MainContent_cmdSubmit" /> 

此代碼不張貼在所有:

<input type="submit" name="ctl00$MainContent$cmdSubmit" value="Submit" onclick="this.disabled = true;WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContent$cmdSubmit&quot;, &quot;&quot;, true, &quot;&quot;, &quot;&quot;, false, false))" id="ctl00_MainContent_cmdSubmit" /> 

顯然它的提交按鈕,冒充真實問題的禁用。你有什麼想法,我們如何禁用提交以避免多次點擊?

回答

4

據推測,btnSubmit已經連接了一個服務器端事件。如果是這樣,則不需要致電Page.GetPostBackEventReference。您應該簡單地通過刪除該行來獲得所需的行爲。

更新:您提到在C#代碼中附加事件處理程序,但您沒有提及您在哪裏執行此操作。我猜這是在Page_Load處理程序。如果是這樣的話,它將無法正常工作,因爲在這一點上掛接按鈕單擊事件處理程序爲時已晚。我們來試試這個。首先,將JS放入它自己的函數中而不是在C#代碼隱藏中構建它會更清潔。我建議你把它變成一個腳本塊

function disableOnSubmit(target) 
{ 
    if (typeof(Page_ClientValidate) == 'function') { 
     if (Page_ClientValidate() == false) { return false; } 
    } 
    target.value = 'Please wait...'; 
    target.disabled = true; 
    return true; 
} 

併爲您的ASPX按鈕,試試這個(或更好,但它自己的.js文件。):

<asp:Button ID="cmdSubmit" runat="server" Text="Submit" onclick="btnSumbit_Click" OnClientClick="return disableOnSubmit(this);" /> 
+0

當我刪除該行實際上它並不提交。我有這個附加到按鈕,但它從來沒有調用該功能時,該行不在那裏: this.btnSubmit.Click + = new EventHandler(btnSumbit_Click); – 2008-11-13 03:34:49

+0

嗯。你可以嘗試添加返回true;到你的JavaScript塊的末尾,看看會發生什麼? – 2008-11-13 04:07:45

0

採取這一行了,表單已經提交,因爲它是一個提交按鈕,而不是一個常規的按鈕類型,請看看ASP.NET如何呈現元素。

頁面驗證器在form.onsubmit回調中調用,所以如果你的頁面無效,它將在那裏被驗證。

所以,只要刪除該行,你就會被設置。

0
private void checkButtonDoubleClick(Button button) 
    { 
     System.Text.StringBuilder sbValid = new System.Text.StringBuilder(); 
     sbValid.Append("if (typeof(Page_ClientValidate) == 'function') { "); 
     sbValid.Append("if (Page_ClientValidate() == false) { return false; }} "); 
     sbValid.Append("this.value = 'Please wait...';"); 
     sbValid.Append("this.disabled = true;"); 
     sbValid.Append(this.Page.ClientScript.GetPostBackEventReference(button, "")); 
     sbValid.Append(";return false;"); 
     button.Attributes.Add("onclick", sbValid.ToString()); 
    } 
1

答案是添加一個返回false;在你最後一行之後;

例如

sbValid.Append(this.Page.ClientScript.GetPostBackEventReference(button, "")); 
sbValid.Append(";"); 

必須

sbValid.Append(this.Page.ClientScript.GetPostBackEventReference(button, "")); 
sbValid.Append(";return false;"); 

這無疑爲我工作。

0

試試下面的代碼

<asp:Button ID="cmdSubmit" runat="server" Text="Submit" onclick="btnSumbit_Click" OnClientClick="this.style.display = 'none';"/> 
-1

試試這個:

<asp:Button ID="btn" runat="server" Text="something" onclick="btn_Click" 
ValidationGroup="V1" onClientClick="if(Page_ClientValidate('V1')) 
{this.disabled=true;this.value='Please Wait....';__doPostBack(this.id);} 
"UseSubmitBehavior="false" />