我的问题是,我有一个简单的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);
}
答案 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>