2013-01-23 153 views
0

使用WebForms時,如何在僅點擊IT之後以及驗證通過後禁用按鈕?在驗證之後和回發之前禁用Webform按鈕

我知道有:Disable asp.net button after click to prevent double clicking

不過,也有我的網頁上其他回傳,最後按下按鈕這證實了之前預訂的,我需要這些就可以了。

這只是最終的按鈕按下,我需要確保通過驗證,但只允許一次按下,才能被禁用。

代碼如下:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     FinalButton.Attributes.Add("onclientclick", "if(Page_ClientValidate('vg')){this.disabled = true; }"); 
    } 

} 
protected void Button1_Click(object sender, EventArgs e) 
{ 
    TextBox1.Text = "Hi"; 
} 
protected void Button3_Click(object sender, EventArgs e) 
{ 
    TextBox1.Text = ""; 
} 

ASPX頁面:

<p> 
    <asp:TextBox ID="TextBox1" runat="server" ValidationGroup="vg"></asp:TextBox> 
</p> 
<p> 
    <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Set TextBox1 to Hi" /> 
    <asp:Button ID="Button3" runat="server" OnClick="Button3_Click" Text="Set TextBox1 to Empty" /> 
</p> 
<p> 
    <asp:Button ID="FinalButton" runat="server" Text="Final Submit" ValidationGroup="vg" /> 
    <asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ControlToValidate="TextBox1" ErrorMessage="RequiredFieldValidator" ValidationGroup="vg"></asp:RequiredFieldValidator> 
</p> 

所以,除非該文本框被填充, 「FinalButton」 不應該提交(這部分作品)。然而,如果填充了文本框,那麼它應該被禁用,以避免重複點擊,回發前 - 但它並沒有禁止,所以我在這裏假設我的代碼,是不正確的:

FinalButton.Attributes.Add("onclientclick", "if(Page_ClientValidate('vg')){this.disabled = true; }"); 

來源當它呈現的頁面,展示該按鈕:

<input type="submit" name="ctl00$MainContent$FinalButton" value="Final Submit" onclick="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;ctl00$MainContent$FinalButton&quot;, &quot;&quot;, true, &quot;vg&quot;, &quot;&quot;, false, false))" id="MainContent_FinalButton" onclientclick="if(Page_ClientValidate(&#39;vg&#39;)){this.disabled = true; }" /> 

謝謝

馬克

+0

嗨 - 我已經試過了鏈接到這個SO:http://aspsnippets.com/Articles/ Disable-Button-before-Page-PostBack-in-ASP.Net.aspx - 但在最後一頁之前我的頁面上會有回傳 - 所以此解決方案會禁用與最終提交操作無關的回傳按鈕。我也嘗試過:http://stackoverflow.com/questions/13959256/disable-submit-button-after-one-click-with-validation和SO/Google上的其他鏈接。 – Mark

+0

請張貼您的嘗試的一些代碼和錯誤是什麼。 「我的網頁上的其他回覆」是什麼意思?這些與最終按鈕有什麼關係?所有按鈕是否一次都處於活動狀態,並且您只希望在其點擊事件中禁用一個按鈕? – MikeSmithDev

+0

你需要你的其他按鈕來做回調使用ajax或javascript..you不能回覆你的整個頁面與一個按鈕,並期望一切都是相同的。 –

回答

1

您可以在渲染HTML按鈕,您的單引號看到GET ting更改爲&#39;,這是一項ASP.NET安全功能。 SO上的一些帖子(如Stop the tag builder escaping single quotes ASP.NET MVC 2)已經貼出來解決這個問題,但我個人不會採取這種方式。

請注意,對於這兩個示例,我添加了一個return false來停止表單提交,以便您可以看到實際禁用的按鈕。當你準備好繼續測試你的代碼時刪除它。

您可以只把你的代碼的按鈕本身:

<asp:Button ID="FinalButton" runat="server" OnClientClick="if(Page_ClientValidate('vg')){this.disabled = true; return false; }" Text="Final Submit" ValidationGroup="vg" /> 

這工作,但看起來骯髒。它的清潔劑沒有這種OnClientClick只是用javascript添加單擊事件:

<script> 
    $("#<%= FinalButton.ClientID %>").click(function() { 
     if (Page_ClientValidate('vg')) { 
      this.disabled = true; return false; 
     } 
    }); 
</script> 

好了,所以,一旦你看到的工作,並且要刪除該return false;,你仍然會有問題。即,禁用的按鈕不會在某些瀏覽器中執行回發。所以有些瀏覽器會回發,其他瀏覽器會像return false;一樣。這不好。

更糟的是,無論哪種瀏覽器,ASP.NET是要運行一個禁用按鈕的click事件(如果你喜歡OnClick="FinalButton_Click"添加一些按鈕)。您可以在IE9中進行測試,因爲禁用的按鈕仍會回發,但您可以看到您的活動不會觸發。另一方面,Chrome會禁用你的按鈕而不是回發。

+0

非常感謝 - 只是確認在這種情況下,似乎沒有跨瀏覽器解決方案。乾杯,馬克 – Mark

1

您可以使用setTimeout的把戲禁用按鈕回傳被觸發後右:

<script> 
    $("#<%= FinalButton.ClientID %>").click(function() 
    { 
     var self = this; 
     setTimeout(function() 
     { 
      self.disabled = true; 
     }, 0); 
    }); 
</script> 
+0

漂亮的黑客,我贊成哈哈! –

相關問題