<%@ Page Title="Test Disable Subsequent Submit Clicks Page" 
	Language="C#" AutoEventWireup="true"
    CodeBehind="Default.aspx.cs" Inherits="_Default" %>
<body>
    <form id="Form1" runat="server" action="Default.aspx">
    <div>
        <asp:ScriptManager ID="ScriptManager" runat="server">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="AsynUpdatePanel" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
            <!-- Here on click is a long running operation e.g. 30 secs -->
                <asp:Button ID="Submit" runat="server" 
			OnClick="Submit_Click" Text="Submit" />
                <asp:UpdateProgress ID="UpdateProgress" 
			runat="server" AssociatedUpdatePanelID="AsynUpdatePanel"
                    DynamicLayout="False">
                    <ProgressTemplate>
                        Update in Progress...</ProgressTemplate>
                </asp:UpdateProgress>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>

    <!-- Here we are blocking the subsequent requests using client side scripting -->
    <!-- Also instead of alert one can customize the way he wants to handle -->
    <script type="text/javascript" language="javascript">
        var requestManager = Sys.WebForms.PageRequestManager.getInstance();
        requestManager.add_initializeRequest(CancelPostbackForSubsequentSubmitClicks);

        function CancelPostbackForSubsequentSubmitClicks(sender, args) {
            if (requestManager.get_isInAsyncPostBack() & 
		args.get_postBackElement().id == 'Submit')
            {
                args.set_cancel(true);                
                alert('A previous request is still in progress 
		that was issued on clicking ' + args.get_postBackElement().id);
            }
        }
    </script>
    </form>
</body>

protected void Submit_Click(object sender, EventArgs e)
{
    //A long running operation
    System.Threading.Thread.Sleep(30000);
}