单击后禁用按钮,同时保持CausesValidation和OnClick-Method

时间:2011-12-15 13:59:35

标签: c# asp.net validation button postback

所以我有了这个按钮:

<asp:Button runat="server" ID="btnSubmit" meta:resourcekey="btnSubmit" CausesValidation="true" OnClick="btnSubmit_Click" />

meta:resourcekey用于本地化资源,这里不关心我们 - 因为我们可以看到它有一个OnClick-Method并导致验证。

也行得很好,但是我想在用户点击它之后禁用该按钮,这样他/她就不能在PostBack成功之前多次点击它,所以这就是我在Page_Load中所做的:

btnSubmit.Attributes.Add("onclick", "this.disabled=true;" +
        Page.ClientScript.GetPostBackEventReference(btnSubmit, "").ToString());

onclick我正在禁用该按钮并重新添加OnClick-Method所需的PostBackReference。

问题:CauseValidation消失了,悲伤。我究竟会如何在CodeBehind中重新添加它或者 - 这是一个完全不同的解决方案?

我的按钮必须:

a)单击后禁用自身,但在回发后启用 b)有一个OnClick CodeBehind方法 c)导致验证

谢谢,

丹尼斯

3 个答案:

答案 0 :(得分:4)

只需使用

覆盖页面或母版页的Onload事件
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;");
}

答案 1 :(得分:3)

在Page_Load

中尝试以下操作

VB

Dim postBackOptions As PostBackOptions = New PostBackOptions(btnSubmit)
btnSubmit.OnClientClick = "this.disabled=true;"
btnSubmit.OnClientClick += ClientScript.GetPostBackEventReference(postBackOptionClaim)

C#

PostBackOptions postBackOptions = new PostBackOptions(btnSubmit);
btnSubmit.OnClientClick = "this.disabled=true;";
btnSubmit.OnClientClick += ClientScript.GetPostBackEventReference(postBackOptionClaim);

答案 2 :(得分:0)

修改

if(Page_ClientValidate()) {this.visibility='hidden';}

如果您在知道是否隐藏/禁用按钮之前需要进行服务器端验证,则可能需要放弃禁用按钮并确保服务器端代码执行不超过如果用户敲击按钮,则必须使用。

你可以在page_load中放置一个隐藏字段并为其生成一个GUID if(!IsPostBack)然后在你的btnSubmit_click上执行类似

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