微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AJAX 中Sys.WebForms.PageRequestManager的事件激发顺序

AJAX 中Sys.WebForms.PageRequestManager的事件激发顺序

测试代码

[c-sharp] view plain copy
  1. 测试代码如下:
  2. <%@PageLanguage="C#"AutoEventWireup="true"CodeBehind="Test.aspx.cs"Inherits="AjaxCtpWebDemo.Test"%>
  3. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <htmlxmlns="http://www.w3.org/1999/xhtml">
  5. <headrunat="server">
  6. <title>无标题页</title>
  7. </head>
  8. <body>
  9. <formid="form1"runat="server">
  10. <asp:ScriptManagerID="ScriptManager1"runat="server">
  11. </asp:ScriptManager>
  12. <%=DateTime.Now.ToString()%><hr/>
  13. <asp:UpdatePanelID="UpdatePanel1"runat="server">
  14. <ContentTemplate>
  15. <%=DateTime.Now.ToString()%>
  16. <hr/>
  17. <asp:ButtonID="Button1"runat="server"Text="Button"/>
  18. </ContentTemplate>
  19. </asp:UpdatePanel>
  20. <mce:scripttype="text/javascript"language="javascript"><!--
  21. Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(
  22. function(sender,e)
  23. {
  24. alert("add_initializeRequest");
  25. }
  26. );
  27. Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
  28. alert("add_endRequest");
  29. }
  30. );
  31. Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
  32. function(sender,e){
  33. alert("add_beginRequest");
  34. Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(
  35. alert("add_pageLoaded");
  36. Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(
  37. alert("add_pageLoading");
  38. //--></mce:script>
  39. </form>
  40. </body>
  41. </html>

最终结果如下:

1.页面第一次进入时,会首先激发add_pageLoaded事件

2.异步提交时,事件的激发顺序如下:

add_initializeRequest

add_beginRequest

add_pageLoading

add_pageLoaded

add_endRequest

add_pageLoaded

转:http://www.cnblogs.com/fifastar/archive/2008/06/02/1212225.html

获取PageRequestManager的实例:var prm = Sys.WebForms.PageRequestManager.getInstance();
属性prm.get_isInAsyncPostBack():判断一个异步回送是否正在进行

方法prm.abortPostBack():一个正在执行中的异步回送取消。

客户端页面的生命周期

1、initializeRequest:
触发时机:当一个异步请求的回送被初始化之前引发。
添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(initFunc);
移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_initializeRequest(initFunc);
initFunc是该页面初始化之前要执行的客户端方法。该方法的声明为:
function initFunc(sender,args)
{
//args的数据类型是:InitializeRequestEventArgs类型。
//args.get_postBackElement():取得初始化异步回送的元素对象。
//args.get_postBackElement().id取得初始化异步回送的元素对象的id号
//args.get_postBackElement().value取得初始化异步回送的元素对象的value值
//args.set_cancel(bool):取消初始化异步回送,即丢弃该异步回送。
}
如果异步处理的过程比较慢,在异步处理的过程中再次发出同样的请求的话,那后者的异步处理请求会取消掉前一步未处理完的请求。这就是认的异步请求优先级--“后者优先”。
我们通常回利用initailizeRequest事件来取消一个异步回送正在进行的回送和将要初始化的回送)。

copy
    <asp:ScriptManagerID="ScriptManager1"runat="server"/>
  1. <asp:UpdateProgressID="UpdateProgress1"runat="server"displayAfter="0"DynamicLayout="false">
  2. <Progresstemplate>
  3. <spanstyle="color:Red"mce_style="color:Red">Loading...</span>
  4. </Progresstemplate>
  5. </asp:UpdateProgress>
  6. <%=DateTime.Now%><br/>
  7. <asp:LabelID="Label1"runat="server"Text=""></asp:Label><br/>
  8. <asp:ButtonID="btnPrecedence"runat="server"Text="优先"OnClick="btnPrecedence_Click"/>
  9. <asp:ButtonID="Button2"runat="server"Text="普通"OnClick="btnPrecedence_Click"/>
  10. </ContentTemplate>
  11. </asp:UpdatePanel>
  12. <divid="Message"style="color:Red"mce_style="color:Red">
  13. </div>
  14. varlastPostBackButtonId=null;//上一次事件控件ID
  15. varbtnPrecedenceId="<%=this.btnPrecedence.ClientID%>"//优先级高的控件ID
  16. Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(
  17. {
  18. //定义一个全局PageRequestManager实例赋值给变量prm
  19. varprm=Sys.WebForms.PageRequestManager.getInstance();
  20. //是否已有异步刷新
  21. if(prm.get_isInAsyncPostBack())
  22. if(lastPostBackButtonId==btnPrecedenceId)//上次跟本次都是点击优先按钮
  23. e.set_cancel(true);//取消异步更新
  24. if(e.get_postBackElement().id==btnPrecedenceId)
  25. showMessage("不可重复发起优先的刷新1。");
  26. }else
  27. showMessage("请等待优先的刷新结束2。");
  28. return;
  29. elseif(e.get_postBackElement().id==btnPrecedenceId)//本次点击是优先按钮,但上次却不是优先按钮
  30. showMessage("发起优先的刷新,普通的刷新将被取消3。");
  31. else//本次点击不是优先按钮,上次点击也不是优先按钮
  32. showMessage("重新发起普通刷新,前一次将被取消4。");
  33. lastPostBackButtonId=e.get_postBackElement().id;
  34. //--></mce:script>
  35. <mce:scripttype="text/javascript"language="javascript"><!--
  36. vartimeoutSeed=null;
  37. functionshowMessage(message,timeout)
  38. $get("Message").innerHTML=message;
  39. //连续发送请求,把前一个清楚掉
  40. if(timeoutSeed)
  41. window.clearTimeout(timeoutSeed);
  42. timeoutSeed=window.setTimeout(function(){$get("message").innerHTML="";
  43. },timeout||2500)
  44. //--></mce:script>

copy
    protectedvoidPage_Load(objectsender,EventArgse)
  1. voidbtnPrecedence_Click( Thread.Sleep(3000);
  2. Buttonbutton=senderasButton;
  3. Label1.Text=String.Format("您点击了“{0}”按钮",button.Text);
  4. }

2、beginRequest:
触发时机:在异步请求初始化完成,且向服务器提出请求之前引发。
添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(beginFunc);
移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_beginRequest(beginFunc);
beginFunc是向服务器提出请求之前要执行的客户端方法。该方法的声明为:
function beginFunc(sender,255)">//args的数据类型是:BeginRequestEventArgs类型。
//args.get_postBackElement():取得初始化异步回送的元素对象。
}
我们通常在beginRequest事件中设置一个标头,或是启始化一个动化告知用户正在进行请求处理。

copy
    <asp:UpdatePanelID="UpdatePanel1"runat="server">
  1. <asp:ButtonID="Button1"runat="server"Text="Button1"OnClick="Button_Click"/>
  2. <Triggers>
  3. <asp:AsyncPostBackTriggerControlID="Button2"/>
  4. </Triggers>
  5. <asp:UpdateProgressID="UpdateProgress1"runat="server"displayAfter="0"AssociatedUpdatePanelID="UpdatePanel1">
  6. <hr/>
  7. <asp:ButtonID="Button2"runat="server"Text="Button2"OnClick="Button_Click"/>
  8. Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
  9. if(e.get_postBackElement().id!="<%=this.Button2.ClientID%>")
  10. varupdateProgress=$get("<%=this.UpdateProgress1.ClientID%>");
  11. vardynamicLayout=<%=this.UpdateProgress1.DynamicLayout.ToString().ToLower()%>;
  12. if(dynamicLayout)
  13. updateProgress.style.display="block";
  14. updateProgress.style.visibility="visible";
  15. )
  16. //--></mce:script>

copy
    voidButton_Click( Thread.Sleep(2000);
  1. }


3、pageLoading:
触发时机:异步回送已经被服务器接收并响应,但还没有对页面进行任何更新之前引发
添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(loadingFunc);
移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_pageLoading(loadingFunc);
loadingFunc是页面更新之前要执行的客户端方法。该方法的声明为:
function loadingFunc(sender,255)">//args的数据类型是:PageLoadingEventArgs类型。
//args代表内容将要被更新或删除的UpdatePanel控件的<div>。
//var arr = args.get_panelsDeleting(); 取得将被删除的各个UpdatePanel控件的<div>
//var arr = args.get_panelsUpdating();取得将被更新的各个UpdatePanel控件的<div>
}

5、endRequest:
触发时机:回送请求处理完毕后,就会引发endRequest事件。
添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endFunc);
移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_endRequest(endFunc);
endFunc是页面请求完成后执行的客户端方法。该方法的声明为:
function endRequest(sender,255)">//args的数据类型是:EndRequestEventArgs类型
//var err = args.get_error():判断是否发生错误,并取得错误对象。
//var em = args.get_error().message:取得错误的出错信息。
//args.set_errorHandled(true):设置错误已被处理。
//var gm = args.get_errorHandled():判断错误是否被处理。
//异步请求发生异常后,如果程序员不在客户端捕获处理的话,PageRequestManager对象会将其以对话框的形式弹出异常的信息。如果程序员想自己编写错误处理代码,而不交由PageRequestManager对象处理的话。那程序员可以通过args.get_error().message属性取得错误信息,然后编写异常处理代码,最后记得执行args.set_errorHandled(true)。这样就阻止异常继续回返给PageRequestManager对象。具体使用在后面将详细说明。
}

copy
    <asp:ButtonID="btnError"runat="server"Text="Error"OnClick="btnError_Click"/>
  1. <asp:ButtonID="btnTimeout"runat="server"Text="Timeout"OnClick="btnTimeout_Click"/>
  2. <inputid="button"type="button"value="Abort"onclick="Sys.WebForms.PageRequestManager.getInstance().abortPostBack();"/>
  3. <asp:ButtonID="btnDataItem"runat="server"Text="ReisterDataItem"OnClick="btnDataItem_Click"/>
  4. <mce:scripttype="text/javascript"><!--
  5. Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
  6. if(e.get_error())
  7. e.set_errorHandled(true);
  8. if(e.get_response().get_timedOut())
  9. showMessage("您的请求已超时。")
  10. }if(e.get_response().get_statusCode()!=200)
  11. showMessage("遇到未知错误。");
  12. showMessage(e.get_error().message);
  13. if(e.get_response().get_aborted())
  14. showMessage('您的请求已取消')
  15. varupId="<%=this.UpdatePanel1.ClientID%>";
  16. varitem=e.get_dataItems()[upId];
  17. showMessage("您注册了:"+item);
  18. });
  19. copy
      ScriptManager.GetCurrent(Page).AsyncPostBackTimeout=3;
    1. voidbtnError_Click(inttwo=2;
    2. inti=3/(two-2);
    3. voidbtnTimeout_Click( Thread.Sleep(5000);
    4. voidbtnDataItem_Click( ScriptManager.GetCurrent(this).RegisterDataItem(UpdatePanel1,DateTime.Now.ToString());
    5. }


    4、pageLoaded:
    触发时机:回送完成页面区域被更新之后引发。
    添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(loadedFunc);
    移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_pageLoaded(loadedFunc);
    loadedFunc是页面更新后要执行的客户端方法。该方法的声明为:
    function loadedFunc(sender,255)">//args的数据类型是:PageLoadedEventArgs类型 //args代表更新的或创建的UpdatePanel控件的<div> //var arr = args.get_panelsUpdated();取得被更新的各个UpdatePanel控件的<div> //var arr = args.get_panelsCreated();取得新创建的各个UpdatePanel控件的<div> }

    原文地址:https://www.jb51.cc/ajax/163333.html

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

    相关推荐