How to Disable Controls During Postback in ASP

The other day, I was working on a page in a webforms app where a postback, triggered by a button click, kicked off a bit of processing that would run from 10-20 seconds. While this is going on, it makes sense to disable the clicked button and other controls, for that matter. Since the processing occurs on the server, the only way to achieve this effect is by disabling the buttons and other controls on the client side, by using javascript. The following is the series of steps leading up to getting this right. If you just want to see what worked, you can skip to the end.

The first thing I did was find a bit of jquery that would disable things on the page. I put this into the user control in which I was doing this:

<script>
    function disableOnPostback() {
        $(":input").attr("disabled", true);
    }
</script>

From there, I found that the way to distinguish between a server-side click handler (“OnClick” property) and a client-side one was to use OnClientClick, like so:

<asp:Button ID="SearchButton" runat="server" Text="Search" OnClientClick="javascript: disableOnPostback();" OnClick="SearchButton_Click" CssClass="search" />

Here we have some standard button boilerplate, the server side event handler “SearchButton_Click” and the new OnClientClick that triggers javascript invocation and our jquery implementation. I was pretty pumped about this and ready to have my search button disable all client side controls and disable them until the server returned a response. I fired it up, clicked the search button, and absolutely nothing happened. Not only was nothing disabled, but there was no postback. After some googling around, someone recommended adding “return true;” after the disableOnPostback() call. Apparently any intervening client side handler not returning true is assumed to return false which stops the postback. So here is the new attempt:

<asp:Button ID="SearchButton" runat="server" Text="Search" OnClientClick="javascript: disableOnPostback(); return true;" OnClick="SearchButton_Click" CssClass="search" />

This had no discernible effect, and after some searching, I found that the meat of the issue here is that disabling the button apparently also disables its ability to trigger a postback. We need to tell the button to fire the postback regardless, which apparently can be accomplished with UseSubmitBehavior=false as a property.

<asp:Button ID="SearchButton" runat="server" Text="Search" UseSubmitBehavior="false" OnClientClick="javascript: disableOnPostback(); return true;" OnClick="SearchButton_Click" CssClass="search" />

I tried this and, finally, something different! Only problem was that it was a partial success. The disabling of controls finally worked, but the postback never happened. On a hunch, I took out the return true and arrived at my final answer:

<asp:Button ID="SearchButton" runat="server" Text="Search" UseSubmitBehavior="false" OnClientClick="javascript: disableOnPostback();" OnClick="SearchButton_Click" CssClass="search" />

This combined with the jquery at the top of the page did the trick. So if you have a button that triggers a postback with a lengthy operation and you want to disable all controls until the operation completes and returns a response, this should do the trick. I am not yet an expert in under-the-covers webforms particulars, so the theory is still a little hazy on my end, but hopefully this helps anyone in a similar position to me. Also, if you are an expect in this stuff, please feel free to weigh in on the theory at play here.

On final thing that I’ll mention is that I did find something called Postback Ritalin during my searches. This seems to offer a control to take care of this for you, though I didn’t really want to introduce any third party dependencies, so I didn’t try anything with it myself.

  • Eduardo

    This is the first article on this particular topic I have read to give a coherent and functional explanation on how to disable a button while at the same time let the postback takes place!!! Thanks a lot!!!!

  • http://www.daedtech.com/blog Erik Dietrich

    Glad it helped! Thanks for the feedback — I appreciate it.