During asynchronous postback, e.g., a click of a button, one may decide that until the current request completes, the user shall not be able to click the button.
In the code snippet below, I have displayed how we can achieve this. We have a Form on which we have Script Manager which contains the Update Panel. This Update Panel contains a Button
and a UpdateProgress
control. We need to disable the subsequent clicks of this Button
when a request is being processed in ASP.NET AJAX client script code.
In order to achieve the same:
- I have used
PageRequestManager
and attached initializeRequest
handler to CancelPostbackForSubsequentSubmitClicks
- In
CancelPostbackForSubsequentSubmitClicks
, check if async postback is in progress using isInAsyncPostBack
property of PageRequestManager
and postback is generated by this Button
, then cancel this request
<%@ 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>
<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>
<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)
{
System.Threading.Thread.Sleep(30000);
}