C# 单击后禁用按钮,同时维护CausesValidation和OnClick方法

C# 单击后禁用按钮,同时维护CausesValidation和OnClick方法,c#,asp.net,validation,button,postback,C#,Asp.net,Validation,Button,Postback,我有一个按钮: <asp:Button runat="server" ID="btnSubmit" meta:resourcekey="btnSubmit" CausesValidation="true" OnClick="btnSubmit_Click" /> onclick我正在禁用按钮并重新添加onclick方法所需的PostBackReference 问题:原因验证不见了,sadface。我到底应该如何在CodeBehind中重新添加它?或者,对于这个问题,什么是完全不同的

我有一个按钮:

<asp:Button runat="server" ID="btnSubmit" meta:resourcekey="btnSubmit" CausesValidation="true" OnClick="btnSubmit_Click" />
onclick我正在禁用按钮并重新添加onclick方法所需的PostBackReference

问题:原因验证不见了,sadface。我到底应该如何在CodeBehind中重新添加它?或者,对于这个问题,什么是完全不同的解决方案

我的按钮必须:

a) 单击后禁用自身,但回发后仍将启用 b) 有一个OnClick代码隐藏方法 c) 原因验证

谢谢

丹尼斯编辑

如果在知道是否隐藏/禁用按钮之前需要进行服务器端验证,那么您可能希望放弃禁用按钮,只要确保在用户敲击按钮时,服务器端代码不会执行过多

如果(!IsPostBack),您可以在页面中放置一个隐藏字段并为其生成GUID,然后在您的btnSubmit上单击执行以下操作

if(Session[Page.ToString() + "_spam"] != null && Session[Page.ToString() + "_spam"] == hdnGuid.Value) { 
    return 
} else { 
    Session[Page.ToString() + "_spam"] = hdnGuid.Value; 
    //do stuff 
}

在页面加载中尝试以下操作

VB C#
只需用

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
   // prevents form from being submitted multiple times in MOST cases
   // programatic client-side calls to __doPostBack() can bypass this
    Page.ClientScript.RegisterOnSubmitStatement(GetType(), "ServerForm",
    "if (this.submitted) return false; this.submitted = true; return true;");
}

这将如何解决我的问题?是的,显然这和禁用一样有效,但我仍然需要激活onclick。@Dennis Röttger-只有当所有内容都有效时,才想隐藏按钮,所以使用Page_ClientValidate()检查是否所有内容都正确。不管怎样,现在可以了-下一个问题:Page无效,按钮点击被触发,按钮验证页面,验证程序抛出他们的错误文本,一切都很好-除了按钮保持禁用,因为没有引发回发。想法?很好地工作,也是目前为止最精简的想法,我不需要禁用按钮和验证/Onclick工作,谢谢!
if(Session[Page.ToString() + "_spam"] != null && Session[Page.ToString() + "_spam"] == hdnGuid.Value) { 
    return 
} else { 
    Session[Page.ToString() + "_spam"] = hdnGuid.Value; 
    //do stuff 
}
Dim postBackOptions As PostBackOptions = New PostBackOptions(btnSubmit)
btnSubmit.OnClientClick = "this.disabled=true;"
btnSubmit.OnClientClick += ClientScript.GetPostBackEventReference(postBackOptionClaim)
PostBackOptions postBackOptions = new PostBackOptions(btnSubmit);
btnSubmit.OnClientClick = "this.disabled=true;";
btnSubmit.OnClientClick += ClientScript.GetPostBackEventReference(postBackOptionClaim);
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
   // prevents form from being submitted multiple times in MOST cases
   // programatic client-side calls to __doPostBack() can bypass this
    Page.ClientScript.RegisterOnSubmitStatement(GetType(), "ServerForm",
    "if (this.submitted) return false; this.submitted = true; return true;");
}