UpdatePanel的简单用法(3) --客户端编程2

PageRequestManager -beginRequest事件

参数 BeginRequestEventArgs
      参数属性:request属性 获得WebRequest对象(用于请求的信息)
                     postBackElement 触发异步刷新的dom元素

常用操作:
--读取请求信息
--改变请求方式
--显示更新提示

如果updateprogress绑定了一个updatePanel的Id,则只有updatePanel内部的刷新请求能触发updateprogress的状态
如果外部触发了一个刷新请求,也需要updatepanel 显示状态,那么就需要手动写代码强制显示

先看看asp.net ajax的updateprogress实现原理:

  1. Sys.WebForms.PageRequestManager.registerClass('Sys.WebForms.PageRequestManager');
  2. Sys.UI._UpdateProgress = function Sys$UI$_UpdateProgress(element) {
  3.     Sys.UI._UpdateProgress.initializeBase(this,[element]);
  4.     this._displayAfter = 500;
  5.     this._dynamicLayout = true;
  6.     this._associatedUpdatePanelId = null;
  7.     this._beginRequestHandlerDelegate = null;
  8.     this._startDelegate = null;
  9.     this._endRequestHandlerDelegate = null;
  10.     this._pageRequestManager = null;
  11.     this._timerCookie = null;
  12. }
  13.     function Sys$UI$_UpdateProgress$get_displayAfter() {
  14.         /// <value type="Number"></value>
  15.         if (arguments.length !== 0) throw Error.parameterCount();
  16.         return this._displayAfter;
  17.     }
  18.     function Sys$UI$_UpdateProgress$set_displayAfter(value) {
  19.         var e = Function._validateParams(arguments, [{name: "value", type: Number}]);
  20.         if (e) throw e;
  21.         this._displayAfter = value;
  22.     }
  23.     function Sys$UI$_UpdateProgress$get_dynamicLayout() {
  24.         /// <value type="Boolean"></value>
  25.         if (arguments.length !== 0) throw Error.parameterCount();
  26.         return this._dynamicLayout;
  27.     }
  28.     function Sys$UI$_UpdateProgress$set_dynamicLayout(value) {
  29.         var e = Function._validateParams(arguments, [{name: "value", type: Boolean}]);
  30.         if (e) throw e;
  31.         this._dynamicLayout = value;
  32.     }
  33.     function Sys$UI$_UpdateProgress$get_associatedUpdatePanelId() {
  34.         /// <value type="String" mayBeNull="true"></value>
  35.         if (arguments.length !== 0) throw Error.parameterCount();
  36.         return this._associatedUpdatePanelId;
  37.     }
  38.     function Sys$UI$_UpdateProgress$set_associatedUpdatePanelId(value) {
  39.         var e = Function._validateParams(arguments, [{name: "value", type: String, mayBeNull: true}]);
  40.         if (e) throw e;
  41.         this._associatedUpdatePanelId = value;
  42.     }
  43.     function Sys$UI$_UpdateProgress$_handleBeginRequest(sender, arg) {
  44.         var curElem = arg.get_postBackElement();
  45.         var showProgress = !this._associatedUpdatePanelId; 
  46.         while (!showProgress && curElem) {
  47.             if (curElem.id && this._associatedUpdatePanelId === curElem.id) {
  48.                 showProgress = true
  49.             }
  50.             curElem = curElem.parentNode; 
  51.         } 
  52.         if (showProgress) {
  53.             this._timerCookie = window.setTimeout(this._startDelegate, this._displayAfter);
  54.         }
  55.     }
  56. //下面的方法就是UpdateProgress显示的实现
  57. //_dynamicLayout属性为true的时候,说明一个异步请求在提交
  58. //_dynamicLayout属性为 false的时候,说明请求结束,隐藏掉
  59. //我们可以模仿这个方法强制显示updatepregress
  60. //-------------------------------------------------------------------------------------------------------
  61.     function Sys$UI$_UpdateProgress$_startRequest() {
  62.         if (this._pageRequestManager.get_isInAsyncPostBack()) {
  63.             if (this._dynamicLayout) this.get_element().style.display = 'block';
  64.             else this.get_element().style.visibility = 'visible';
  65.         }
  66.         this._timerCookie = null;
  67.     }
  68. //--------------------------------------------------------------------------------------------------------
  69. //下面函数调用了handleEndRequest所以我们不用做处理,异步刷新请求后直接调隐藏
  70. //--------------------------------------------------------------------------------------------------------
  71.     function Sys$UI$_UpdateProgress$_handleEndRequest(sender, arg) {
  72.         if (this._dynamicLayout) this.get_element().style.display = 'none';
  73.         else this.get_element().style.visibility = 'hidden';
  74.         if (this._timerCookie) {
  75.             window.clearTimeout(this._timerCookie);
  76.             this._timerCookie = null;
  77.         }
  78.     }
  79. //----------------------------------------------------------------------------------------------------------
  80.     function Sys$UI$_UpdateProgress$dispose() {
  81.        if (this._pageRequestManager !== null) {
  82.            this._pageRequestManager.remove_beginRequest(this._beginRequestHandlerDelegate);
  83.            this._pageRequestManager.remove_endRequest(this._endRequestHandlerDelegate);
  84.        }
  85.        Sys.UI._UpdateProgress.callBaseMethod(this,"dispose");
  86.     }
  87.     function Sys$UI$_UpdateProgress$initialize() {
  88.         Sys.UI._UpdateProgress.callBaseMethod(this'initialize');
  89.         this._beginRequestHandlerDelegate = Function.createDelegate(thisthis._handleBeginRequest);
  90.         this._endRequestHandlerDelegate = Function.createDelegate(thisthis._handleEndRequest);
  91.         this._startDelegate = Function.createDelegate(thisthis._startRequest);
  92.         if (Sys.WebForms && Sys.WebForms.PageRequestManager) {
  93.            this._pageRequestManager = Sys.WebForms.PageRequestManager.getInstance();
  94.         }
  95.         if (this._pageRequestManager !== null ) {
  96.                     this._pageRequestManager.add_beginRequest(this._beginRequestHandlerDelegate);
  97.             this._pageRequestManager.add_endRequest(this._endRequestHandlerDelegate);
  98.         }
  99.     }
  100. Sys.UI._UpdateProgress.prototype = {
  101.     get_displayAfter: Sys$UI$_UpdateProgress$get_displayAfter,
  102.     set_displayAfter: Sys$UI$_UpdateProgress$set_displayAfter,
  103.     get_dynamicLayout: Sys$UI$_UpdateProgress$get_dynamicLayout,
  104.     set_dynamicLayout: Sys$UI$_UpdateProgress$set_dynamicLayout,
  105.     get_associatedUpdatePanelId: Sys$UI$_UpdateProgress$get_associatedUpdatePanelId,
  106.     set_associatedUpdatePanelId: Sys$UI$_UpdateProgress$set_associatedUpdatePanelId,
  107.     _handleBeginRequest: Sys$UI$_UpdateProgress$_handleBeginRequest,
  108.     _startRequest: Sys$UI$_UpdateProgress$_startRequest,
  109.     _handleEndRequest: Sys$UI$_UpdateProgress$_handleEndRequest,
  110.     dispose: Sys$UI$_UpdateProgress$dispose,
  111.     initialize: Sys$UI$_UpdateProgress$initialize
  112. }
  113. Sys.UI._UpdateProgress.registerClass('Sys.UI._UpdateProgress', Sys.UI.Control);


 下面是资料中PageRequestManager -beginRequest事件的例子:强制显示UpdateProgress

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm5.aspx.cs" Inherits="AJAXEnabledWebApplication1.WebForm5" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5.     <title>无标题页</title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.     <asp:ScriptManager ID="ScriptManager1" runat="server">
  10.     </asp:ScriptManager>
  11.     <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
  12.     <ContentTemplate>
  13.     <%=DateTime.Now%><br />
  14.         <asp:Button ID="btnInUpdatePanel" runat="server" Text="ButtonInUpdatePanel" />
  15.     </ContentTemplate>
  16.     <Triggers>
  17.     <asp:AsyncPostBackTrigger ControlID="btnOutUpdatePanel" />
  18.     </Triggers>
  19.     </asp:UpdatePanel>
  20.     
  21.         <asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1" DynamicLayout="false">
  22.     <ProgressTemplate>
  23.     <div style="color:Red">Loading....</div>
  24.     </ProgressTemplate>
  25.     </asp:UpdateProgress>
  26.     <hr />
  27.     <asp:Button ID="btnOutUpdatePanel" runat="server" Text="ButtonOutUpdatePanel" />
  28.     <script type="text/javascript" language="javascript">
  29.     Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(
  30.       function(sender,e){
  31.         //如果发起异步刷新请求的buttonID不是外部的button return掉
  32.         if(e.get_postBackElement().id!="<%=btnOutUpdatePanel.ClientID %>"){
  33.             return;
  34.         }
  35.         
  36.         //得到 updateProgress
  37.         var updateProgress=$get("<%=this.UpdateProgress1.ClientID %>");
  38.         
  39.         //仿照微软的asp.net ajax库写~
  40.         var dynamicLayout=<%=this.UpdateProgress1.DynamicLayout.ToString().ToLower() %>;
  41.         if(dynamicLayout){
  42.              updateProgress.style.display = "block";
  43.         }
  44.         else{
  45.              updateProgress.style.visibility = "visible";
  46.         }
  47.         
  48.       }
  49.     );
  50.     </script>
  51.     </form>
  52. </body>
  53. </html>
cs代码:

  1. using System;
  2. using System.Collections;
  3. using System.Configuration;
  4. using System.Data;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.HtmlControls;
  9. using System.Web.UI.WebControls;
  10. using System.Web.UI.WebControls.WebParts;
  11. namespace AJAXEnabledWebApplication1
  12. {
  13.     public partial class WebForm5 : System.Web.UI.Page
  14.     {
  15.         protected void Page_Load(object sender, EventArgs e)
  16.         {
  17.             this.btnInUpdatePanel.Click+=new EventHandler(btn_Click);
  18.             this.btnOutUpdatePanel.Click+=new EventHandler(btn_Click);
  19.         }
  20.         protected void btn_Click(object sender, EventArgs e)
  21.         {
  22.             System.Threading.Thread.Sleep(3000);
  23.             
  24.         }
  25.     }
  26. }
下篇将继续介绍这些事件~~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值