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

时间:2010-12-03 10:02:45

标签: c# asp.net button

我的问题是,我有一个简单的Web表单,其中包含两个文本框和一个按钮。页面上有一些asp.net验证器控件。所以我希望客户端在完成所有验证后禁用按钮。禁用按钮,我正在执行一些服务器端代码。所有这一切都工作正常,但是,如果我设置按钮的回发网址,它会失败。 bellow是编码的一部分,可以给你一些简短的想法。任何提示都将受到高度赞赏.......

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

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);
    }

6 个答案:

答案 0 :(得分:11)

这是正确而简单的方法:

在您的应用程序中创建一个帮助器方法(例如在Utlity命名空间中):

    Public Shared Sub PreventMultipleClicks(ByRef button As System.Web.UI.WebControls.Button)
        button.Attributes.Add("onclick", "this.disabled=true;" & button.Page.ClientScript.GetPostBackEventReference(button, String.Empty).ToString)
    End Sub

现在,您可以通过每个网页的代码调用:

    Utility.PreventMultipleClicks(button1)

其中button1是您要阻止多次点击的按钮。

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

然后追加按钮自己的回发处理程序,所以我们得到:

onclick="this.disabled=true";__doPostBack('ID$ID','');"

这不会破坏页面的默认行为,并且可以按预期在所有浏览器中使用。

享受!

答案 1 :(得分:1)

如果您禁用该按钮,则表单提交不会发生。正确的方法是设置计时器以禁用按钮。我还建议使用提交行为而不是回发事件参考。例如,

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));
}

答案 2 :(得分:1)

如果在单击后禁用提交按钮,则不会回发。我现在已经研究了很多个小时了,the best solution I've seen is here(最佳解决方案位于页面底部)

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

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

答案 3 :(得分:0)

我想出了解决方案。只需在单击后隐藏按钮即可。回发将照常进行。完成回发后,您将获得按钮!请参阅how to disable asp.net button on postback上的详细步骤并掌握艺术作品!

答案 4 :(得分:0)

假设这是异步的,并且您在保存之前进行了验证,则可以尝试伪跟随:

    bool hasSavedAlready = false;

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

       }
    }

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

答案 5 :(得分:0)

我遇到了这个问题,以前的解决方案都没有对我有用,但是在我使用了一些混乱之后:

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