如果多次单击,请禁用“提交”按钮。。(C#)

如果多次单击,请禁用“提交”按钮。。(C#),c#,asp.net,button,C#,Asp.net,Button,我的问题是,我有一个简单的web表单,其中包含两个文本框和一个按钮。页面上有一些asp.net验证程序控件。因此,我希望在所有验证完成后客户端禁用按钮。并且在禁用按钮后,我执行一些服务器端代码。所有这些都可以正常工作,但是,若我设置按钮的回发url时失败了。下面是编码的一部分,它将给你一些简单的想法。如有任何提示,我们将不胜感激 我想在复合控件中实现这个功能。 这是按钮课 public class MyButton : Button { protected override void

我的问题是,我有一个简单的web表单,其中包含两个文本框和一个按钮。页面上有一些asp.net验证程序控件。因此,我希望在所有验证完成后客户端禁用按钮。并且在禁用按钮后,我执行一些服务器端代码。所有这些都可以正常工作,但是,若我设置按钮的回发url时失败了。下面是编码的一部分,它将给你一些简单的想法。如有任何提示,我们将不胜感激

我想在复合控件中实现这个功能。 这是按钮课

public class MyButton : Button
{

    protected override void OnPreRender(EventArgs e)
    {
        if (this.CausesValidation)
        {
            if (!String.IsNullOrEmpty(this.ValidationGroup))
            {
                this.Attributes.Add("onclick", @"javascript:

             if (typeof(Page_ClientValidate) == 'function')
                 {
                    if (Page_ClientValidate('" + this.ValidationGroup + "')){" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this) +

              "}else{return;}}  else{" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this) + "}");
            }

            else
            {
                this.Attributes.Add("onclick", @"javascript:

                 if (typeof(Page_ClientValidate) == 'function')
                   {
                      if (Page_ClientValidate()){" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this) +
                  "}else{return;}}  else{" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this) + "}");
            }
        }
        else
            this.Attributes.Add("onclick", "javascript:" + this.ClientID + ".disabled=true;" + Page.GetPostBackEventReference(this));

        base.OnPreRender(e);
    }

如果禁用该按钮,则不会发生表单提交。正确的方法是设置定时器来禁用按钮。我还建议使用submit行为,而不是将post back事件引用

function clickHandler(id, validate, validationGroup) {
   var isValid = true;
   if (validate && typeof(Page_ClientValidate) == 'function') {
     isValid = validationGroup? Page_ClientValidate(validationGroup): Page_ClientValidate();
   }
   if (isValid)
   {
      // set timer to disable the button
      var b = document.getElementById(id);
      var f = function() { b.disabled = 'disabled'; };
      setTimeout(f, 100);
      return true;
   }
   return false;
}
现在将此功能附加到按钮上

protected override void OnPreRender(EventArgs e)
{
    this.Attributes.Add("onclick", 
       string.Format("return clickHandler('{0}', {1}, '{2}')", 
       this.ClientID, this.CausesValidation ? "true" : "false", 
       this.ValidationGroup));
}

我已经想出了解决办法。单击按钮后将其隐藏。回邮将照常进行。完成回发后,您将按原样获得按钮!请参阅上的详细步骤,并掌握这门艺术

这是正确且简单的方法:

在应用程序中创建一个助手方法(例如在UTL命名空间中):

现在,从每个网页背后的代码中,您可以简单地调用:

    Utility.PreventMultipleClicks(button1)
其中button1是要防止多次单击的按钮

这只需将点击处理程序设置为:this.disabled=true

然后附加按钮自己的回发处理程序,因此我们得到:

onclick="this.disabled=true";__doPostBack('ID$ID','');"
这不会破坏页面的默认行为,并在所有浏览器中正常工作


享受吧

如果在单击“提交”按钮后禁用该按钮,则该按钮将不会回发。我已经研究了好几个小时了。(最佳解决方案在页面底部)

我现在正在编写一个自定义服务器控件,添加到从Button扩展而来的工具箱中,并使用此代码的一个稍微修改的版本。(覆盖OnLoad方法)


我允许用户将“处理…”文本更改为其他内容,并且可以创建一个属性,允许在提交完成时将文本更改为其他内容(这将在回发返回时生成)

假设这是异步的,并且在保存之前进行验证,您可以尝试以下操作:

    bool hasSavedAlready = false;

    savedata(){
       if (!hasSavedAlready){ 
       //normal saving code
       ...
       //after success
       hasSavedAlready = true;

       }
    }

这是我能想到的最简单的解决方案。

我遇到了这个问题,以前的解决方案对我都不起作用,但经过一些混乱之后,我使用了:

<asp:LinkButton runat="server" OnClientClick="this.setAttribute('disabled','disabled'); this.text = 'Submit in progress...';" UseSubmitBehavior="false" ID="btnSubmit" ValidationGroup="formSubmit"</asp:LinkButton>

谢谢你的回答。效果很好。我通过扩展方法vs utility/helper创建了相同的解决方案,但效果很好。我为此浪费了很多时间——谢谢你的回答。我投票支持你的答案,我希望有一天O.P.会接受它。这确实打破了默认行为;当ASP.NET验证失败时,它仍然回发并禁用按钮。我有一个linkbutton,只是将脚本修改为:
button.Attributes.Add(“onclick”,“if(this.disabled)”返回false;this.disabled=true…
所有这些解决方案都存在一个问题,即如果在系统运行缓慢时快速单击按钮,则第二次按下可能会排队,并且即使第一次单击禁用了按钮,也会再次调用on click方法。第一个函数是Javascript还是C#?
<asp:LinkButton runat="server" OnClientClick="this.setAttribute('disabled','disabled'); this.text = 'Submit in progress...';" UseSubmitBehavior="false" ID="btnSubmit" ValidationGroup="formSubmit"</asp:LinkButton>