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

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

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

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

这是执行此操作的正确且简单的方法:

在您的应用程序中创建一个帮助器方法(比如在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','');" 

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

请享用!

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

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

现在将function附加到您的按钮

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

如果在单击后禁用提交按钮,则不会回发。 我现在已经研究了很多个小时了, 我见过的最好的解决方案就在这里 。 (最佳解决方案位于页面底部)

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

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

我想出了解决方案。 只需在单击后隐藏按钮即可。 回发将照常进行。 完成回发后,您将获得按钮! 请参阅有关如何在回发时禁用asp.net按钮并掌握艺术的详细步骤!

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

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

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

我遇到了这个问题,以前的解决方案都没有对我有用,但经过一些麻烦后,我使用了: