Dennis Röttger
Dennis Röttger

Reputation: 1985

Disable Button after Click whilst maintaining CausesValidation and an OnClick-Method

So I've got this button:

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

meta:resourcekey is for Localization Resources, doesn't concern us here - as we can see it has got an OnClick-Method and causes Validation.

That works fine, too, but I'd like to disable that button after the user clicked it so he/she can't click it multiple times before the PostBack succeeds, so here's what I did in Page_Load:

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

onclick I'm disabling the button and re-adding the PostBackReference necessary for the OnClick-Method.

Problem: CausesValidation is gone, sadface. How exactly would I re-add that in CodeBehind or alternatively - What's an entirely different solution to this?

My Button has to:

a) disable itself after clicking, yet be enabled after the postback b) have an OnClick CodeBehind Method c) cause Validation

Thanks,

Dennis

Upvotes: 3

Views: 3601

Answers (3)

Rajkumar Vasan
Rajkumar Vasan

Reputation: 712

Try the following in 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);

Upvotes: 3

Louis Ricci
Louis Ricci

Reputation: 21106

EDIT

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

If you need to have server side validation before you know whether to hide/disable the button or not you'll probably want to forgo the disabling of the button and just make sure your server-side code doesn't execute more than necessary if a user hammers on the button.

You could put a hidden field and generate a GUID for it in the page_load if(!IsPostBack) then on your btnSubmit_click do something like

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

Upvotes: 0

Zlatan
Zlatan

Reputation: 698

Just override the Onload event of ur page or master page with

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

Upvotes: 4

Related Questions