防止使用者多次提交
ajax天性的非同步,後台操作的特性使得程式在執行的時候,無法使使用者瞭解當前正在等待的情況,所以使用者往往會多次提交,為了避免由於重複提交造成的伺服器損失以及使用者體驗降低,就有必要阻止使用者多次提交同一個操作。
在ajax 中可以使用PageRequestManager對應所暴露出的 非同步回送各個階段的事件來判斷是否重複提交,PageRequestManager正常時候的事件觸發順序如下:
1.使用者點擊UpdatePanel中的按鈕,觸發一個非同步操作
2.PageRequestManager對象觸發initializeRequest事件。
3.PageRequestManager對象觸發beginRequest事件
4.請求發送到伺服器
5.用戶端成功收到服務的相應。
6.PageRequestManager對象觸發pageLoading事件。
7PageRequestManager對象觸發pageLoaded事件。
8.Application對象觸發load事件
9PageRequestManager對象觸發endRequest時間。
樣本:
aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Multirequest.aspx.cs" Inherits="Multirequest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>無標題頁</title>
<script type="text/javascript">
var prm;
var btnsubmitid = '<%=Button1.ClientID %>'
function pageLoad() {
prm = Sys.WebForms.PageRequestManager.getInstance();
prm.add_initializeRequest(onInitializeRequest);
prm.add_pageLoaded(onPageLoaded);
}
function onInitializeRequest(sender,args)
{
if(prm.get_isInAsyncPostBack() && args.get_postBackElement().id==btnsubmitid)
{
args.set_cancel(true);
showWaitingInfo(true);
setTimeout("showWaitingInfo(false)",1500);
}
}
function showWaitingInfo(visible)
{
var id = $get("messagePanel");
id.style.display=visible?"block":"none";
}
function onPageLoaded(sender,args)
{
showWaitingInfo(false);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1" runat="server" />
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="Label1" runat="server" Text="Name"></asp:Label> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
Msg:<asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="OK"
Width="55px" />
<br />
<br />
<asp:Label ID="Label2" runat="server" Text="Result:"></asp:Label>
<asp:Label ID="lblresult" runat="server"></asp:Label>
<div id="messagePanel" style="display:none;">
Still Processing,Please be patient.
</div>
</ContentTemplate>
</asp:UpdatePanel>
<br />
</div>
</form>
</body>
</html>
cs:
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
this.lblresult.Text = this.TextBox1.Text + " &&&&" + this.TextBox2.Text + "TIME:" + System.DateTime.Now.ToLocalTime();
System.Threading.Thread.Sleep(3000);
}
說明:
function pageLoad() {
//擷取PageRequestManager對象
prm = Sys.WebForms.PageRequestManager.getInstance();
//設定事件觸發
prm.add_initializeRequest(onInitializeRequest);
prm.add_pageLoaded(onPageLoaded);
}
function onInitializeRequest(sender,args)
{
//判斷是否正在非同步回送中,並且引發兩次操作回送的按鈕時同一個。
if(prm.get_isInAsyncPostBack() && args.get_postBackElement().id==btnsubmitid)
{
//取消本次的非同步
args.set_cancel(true);
//顯示資訊提示使用者
showWaitingInfo(true);
//1.5s後隱藏提示資訊
setTimeout("showWaitingInfo(false)",1500);
}
}
停止正在執行的非同步作業
可以使用PageRequestManager對象的abortPostBack()方法停止當前正在執行的非同步作業。
相關code:
function btnCancel_onclick()
{
if(prm.get_isInAsyncPostBack())
{
prm.abortPostBack();
}
}
在執行非同步回送時給使用者提示
在PageRequestManager的onBeginRequest的時候,判斷PageRequestManager的get_postBackElement().id是否為當前提交的按鈕,如果是,則顯示waiting的資訊,並禁止使用頁面等。
當onPageLoaded時,恢複頁面。
在非同步執行時的異常處理
處理PageRequestManager的onEndRequest事件,例如:
function onEndRequest(sender,args)
{
var error = args.get_error();
if(error)
{
//顯示異常。
$get(“messagePanel”).innerHTML = error.message';
//告知asp.net ajax Client framework error 已經處理。
args.set_errorHandled(true);
}
}