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

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

 

 

测试代码: 

 

测试代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Test.aspx.cs" Inherits="AjaxCtpWebDemo.Test" %>

<!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>
</head>
<body>
    <form id="form1" runat="server">
    
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <%=DateTime.Now.ToString() %><hr/>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server">
            <ContentTemplate>
                <%=DateTime.Now.ToString() %>
                <hr/>
                <asp:Button ID="Button1" runat="server" Text="Button" />
            </ContentTemplate>
        </asp:UpdatePanel>
       <mce:script  type="text/javascript" language="javascript"><!--
          Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(
      function(sender, e)
      {
          alert("add_initializeRequest");   
      }
  );
  
  
  Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
      function(sender,e){
          alert("add_endRequest");
      }
  );
  
  
  Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
      function(sender,e){
          alert("add_beginRequest");
      }
  );
  
  
  Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(
      function(sender,e){
          alert("add_pageLoaded");
      }
  );
  
  Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(
      function(sender,e){
          alert("add_pageLoading");
      }
  );
  
  
// --></mce:script> 
  
    </form>
</body>
</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事件来取消一个异步回送(正在进行的回送和将要初始化的回送)。

<asp:ScriptManager ID="ScriptManager1" runat="server" />
    <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" DynamicLayout="false">
        <ProgressTemplate>
            <span style="color: Red" mce_style="color: Red">Loading...</span>
        </ProgressTemplate>
    </asp:UpdateProgress>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <%=DateTime.Now %><br />
            <asp:Label ID="Label1" runat="server" Text=""></asp:Label><br />
            <asp:Button ID="btnPrecedence" runat="server" Text="优先" OnClick="btnPrecedence_Click" />
            <asp:Button ID="Button2" runat="server" Text="普通" OnClick="btnPrecedence_Click" />
        </ContentTemplate>
    </asp:UpdatePanel>
    <div id="Message" style="color: Red" mce_style="color: Red">
    </div>

    <mce:script type="text/javascript" language="javascript"><!--
        var lastPostBackButtonId=null;          //上一次事件 控件ID
        var btnPrecedenceId = "<%=this.btnPrecedence.ClientID %>"   //优先级高的控件ID
        
        Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(
            function(sender,e)
            {
                //定义一个全局PageRequestManager实例赋值给变量 prm
                var prm = Sys.WebForms.PageRequestManager.getInstance();
                //是否已有异步刷新
                if(prm.get_isInAsyncPostBack())
                {
                    if(lastPostBackButtonId==btnPrecedenceId)       //上次跟本次都是点击优先按钮
                    {
                        e.set_cancel(true);//取消异步更新
                        if(e.get_postBackElement().id==btnPrecedenceId)
                        {
                            showMessage("不可重复发起优先的刷新1。");
                        }else
                        {
                            showMessage("请等待优先的刷新结束2。");
                        }
                        return;
                    }
                    else if(e.get_postBackElement().id==btnPrecedenceId) //本次点击是优先按钮,但上次却不是优先按钮
                    {
                        showMessage("发起优先的刷新,普通的刷新将被取消3。");
                    }
                    else //本次点击不是优先按钮,上次点击也不是优先按钮
                    {
                        showMessage("重新发起普通刷新,前一次将被取消4。");
                    }
                }
                lastPostBackButtonId = e.get_postBackElement().id;
            }
        );
    
// --></mce:script>

    <mce:script type="text/javascript" language="javascript"><!--
            var timeoutSeed = null;
            function showMessage(message,timeout)
            {
                $get("Message").innerHTML = message;
                //连续发送请求,把前一个清楚掉
                if(timeoutSeed)
                {
                    window.clearTimeout(timeoutSeed);
                }
                timeoutSeed = window.setTimeout(function(){$get("message").innerHTML="";
                },timeout||2500)
            }
            
    
// --></mce:script>

 

 

protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void btnPrecedence_Click(object sender, EventArgs e)
    {
        Thread.Sleep(3000);
        Button button = sender as Button;
        Label1.Text = String.Format("您点击了“{0}”按钮", button.Text);
    }

 

 

 

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

  

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <%=DateTime.Now %><br />
            <asp:Button ID="Button1" runat="server" Text="Button1" OnClick="Button_Click" />
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="Button2" />
        </Triggers>
    </asp:UpdatePanel>
    <asp:UpdateProgress ID="UpdateProgress1" runat="server" DisplayAfter="0" AssociatedUpdatePanelID="UpdatePanel1">
        <ProgressTemplate>
            <span style="color: Red" mce_style="color: Red">Loading...</span>
        </ProgressTemplate>
    </asp:UpdateProgress>
    <hr />
    <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="Button_Click" />

    <mce:script type="text/javascript" language="javascript"><!--
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
            function(sender,e)
            {
                if(e.get_postBackElement().id != "<%=this.Button2.ClientID %>")
                {
                    return;
                }
                
                var updateProgress = $get("<%=this.UpdateProgress1.ClientID %>");
                var dynamicLayout = <%=this.UpdateProgress1.DynamicLayout.ToString().ToLower() %>;
                if(dynamicLayout)
                {
                    updateProgress.style.display = "block";
                }else
                {
                    updateProgress.style.visibility = "visible";
                }
            }
        )
    
// --></mce:script>

 

 

protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button_Click(object sender, EventArgs e)
    {
        Thread.Sleep(2000);
    }

 

3、pageLoading:
        触发时机:异步回送已经被服务器接收并响应,但还没有对页面进行任何更新之前引发
        添加事件处理代码:Sys.WebForms.PageRequestManager.getInstance().add_pageLoading(loadingFunc);
        移除事件处理代码:Sys.WebForms.PageRequestManager.getInstance().remove_pageLoading(loadingFunc);
             loadingFunc是页面更新之前要执行的客户端方法。该方法的声明为:
             function loadingFunc(sender,args)
             {
                //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,args)
           {
                //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对象。具体使用在后面将详细说明。
           }

 

<asp:UpdatePanel ID="UpdatePanel1" runat="server">
        <ContentTemplate>
            <%=DateTime.Now %><br />
            <asp:Button ID="btnError" runat="server" Text="Error" OnClick="btnError_Click" />
            <asp:Button ID="btnTimeout" runat="server" Text="Timeout" OnClick="btnTimeout_Click" />
            <input id="button" type="button" value="Abort" onclick="Sys.WebForms.PageRequestManager.getInstance().abortPostBack();" />
            <asp:Button ID="btnDataItem" runat="server" Text="Reister DataItem" OnClick="btnDataItem_Click" />
        </ContentTemplate>
    </asp:UpdatePanel>

    <mce:script type="text/javascript"><!--
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(
            function(sender,e){
                if(e.get_error())
                {
                    e.set_errorHandled(true);
                    
                    if(e.get_response().get_timedOut())
                    {
                        showMessage("您的请求已超时。")
                    }else if(e.get_response().get_statusCode() != 200)
                    {
                        showMessage("遇到未知错误。");
                    }else
                    {
                        showMessage(e.get_error().message);
                    }
                }else if(e.get_response().get_aborted())
                {
                    showMessage(‘您的请求已取消‘)
                }
                else
                {
                    var upId = "<%= this.UpdatePanel1.ClientID %>";
                    var item =e.get_dataItems()[upId];
                    showMessage("您注册了:"+item);
                }
            });
    
// --></mce:script>

 

 

 protected void Page_Load(object sender, EventArgs e)
    {
        ScriptManager.GetCurrent(Page).AsyncPostBackTimeout = 3;
    }
    protected void btnError_Click(object sender, EventArgs e)
    {
        int two = 2;
        int i = 3 / (two - 2);
    }
    protected void btnTimeout_Click(object sender, EventArgs e)
    {
        Thread.Sleep(5000);
    }
    protected void btnDataItem_Click(object sender, EventArgs e)
    {
        ScriptManager.GetCurrent(this).RegisterDataItem(UpdatePanel1, DateTime.Now.ToString());
    }

 

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

转自:http://blog.csdn.net/xd43100678/article/details/5953579

 

AJAX 中Sys.WebForms.PageRequestManager的事件激发顺序 《转》,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。