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