1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.WebControls.WebParts;
  9. using System.Web.UI.HtmlControls;
  10. public partial class _Default : Page
  11. {
  12. protected void Page_Load(object sender, EventArgs e)
  13. {
  14. }
  15. #region OnPreInit 第一步
  16. protected override void OnPreInit(EventArgs e)
  17. {
  18. //检查 IsPostBack 属性来确定是不是第一次处理该页。
  19. //创建或重新创建动态控件。
  20. //动态设置主控页。
  21. //动态设置 Theme 属性。
  22. //读取或设置配置文件属性值。
  23. //注意
  24. //如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被重写。
  25. base.OnPreInit(e);
  26. }
  27. #endregion
  28. #region OnInit 第二步
  29. protected override void OnInit(EventArgs e)
  30. {
  31. //在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。
  32. base.OnInit(e);
  33. }
  34. #endregion
  35. #region OnInitComplete 第三步
  36. protected override void OnInitComplete(EventArgs e)
  37. {
  38. //由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。
  39. base.OnInitComplete(e);
  40. }
  41. #endregion
  42. #region PreLoad 第四步
  43. protected override void OnPreLoad(EventArgs e)
  44. {
  45. //如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。
  46. //在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。
  47. base.OnPreLoad(e);
  48. }
  49. #endregion
  50. #region OnLoad 第五步
  51. protected override void OnLoad(EventArgs e)
  52. {
  53. //Page 在 Page 上调用 OnLoad 事件方法,然后以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。
  54. //使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。
  55. base.OnLoad(e);
  56. }
  57. #endregion
  58. #region 控件事件 第六步
  59. protected void Button1_Click(object sender, EventArgs e)
  60. {
  61. //用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
  62. //注意
  63. //在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。
  64. }
  65. #endregion
  66. #region OnLoadComplete 第七步
  67. protected override void OnLoadComplete(EventArgs e)
  68. {
  69. //对需要加载页上的所有其他控件的任务使用该事件。
  70. base.OnLoadComplete(e);
  71. }
  72. #endregion
  73. #region OnPreRender 第八步
  74. protected override void OnPreRender(EventArgs e)
  75. {
  76. //在该事件发生前:
  77. //Page 对象会针对每个控件和页调用 EnsureChildControls。
  78. //设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息,请参见下面的数据绑定控件的数据绑定事件。
  79. //页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。
  80. base.OnPreRender(e);
  81. }
  82. #endregion
  83. #region SaveStateComplete 第九步
  84. protected override void OnSaveStateComplete(EventArgs e)
  85. {
  86. //在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。
  87. //使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。
  88. base.OnSaveStateComplete(e);
  89. }
  90. #endregion
  91. #region Render 第十步
  92. //Render
  93. //这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。
  94. //如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件。
  95. //用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。
  96. #endregion
  97. #region OnUnload 第十一步
  98. protected override void OnUnload(EventArgs e)
  99. {
  100. //该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。
  101. //对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。
  102. //注意www.2cto.com
  103. //在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。
  104. base.OnUnload(e);
  105. }
  106. #endregion
  107. }
 

当页面进行回发时,如点击按钮,以上事件都会重新执行一次,这时的执行顺序为:

1. OnPreInit
2. OnInit
3. OnInitComplete
4. OnPreLoad
5. Page_Load
6. OnLoad
7. Button_Click
8. OnLoadComplete
9. OnPreRender
可以看到,Button_Click事件位于OnLoad之后执行,可以测试一下:

 
  1. public partial class TestControls : System.Web.UI.Page
  2. {
  3. static int count = 0;
  4. protected void Page_Load(object sender, EventArgs e)
  5. {
  6. Response.Write(count+ "Page_Load <br />");
  7. count++;
  8. }
  9. protected override void OnPreInit(EventArgs e)
  10. {
  11. base.OnPreInit(e);
  12. Response.Write(count + "OnPreInit <br />");
  13. count++;
  14. }
  15. protected override void OnInit(EventArgs e)
  16. {
  17. base.OnInit(e);
  18. Response.Write(count + "OnInit <br />");
  19. count++;
  20. }
  21. protected override void OnLoad(EventArgs e)
  22. {
  23. base.OnLoad(e);
  24. Response.Write(count + "OnLoad <br />");
  25. count++;
  26. }
  27. protected override void OnPreLoad(EventArgs e)
  28. {
  29. base.OnPreLoad(e);
  30. Response.Write(count + "OnPreLoad <br />");
  31. count++;
  32. }
  33. protected override void OnLoadComplete(EventArgs e)
  34. {
  35. base.OnLoadComplete(e);
  36. Response.Write(count + "OnLoadComplete <br />");
  37. count++;
  38. }
  39. protected override void OnInitComplete(EventArgs e)
  40. {
  41. base.OnInitComplete(e);
  42. Response.Write(count + "OnInitComplete <br />");
  43. count++;
  44. }
  45. protected override void OnUnload(EventArgs e)
  46. {
  47. base.OnUnload(e);
  48. }
  49. protected override void OnDataBinding(EventArgs e)
  50. {
  51. base.OnDataBinding(e);
  52. Response.Write(count + "OnDataBinding <br />");
  53. count++;
  54. }
  55. protected override void OnPreRender(EventArgs e)
  56. {
  57. base.OnPreRender(e);
  58. Response.Write(count + "OnPreRender <br />");
  59. count++;
  60. }
  61. protected void btnGraphics_Click(object sender, EventArgs e)
  62. {
  63. //Bitmap bmp = new Bitmap(10, 10);
  64. //Graphics g = Graphics.FromImage(bmp);
  65. Response.Write(count + "btnGraphics_Click <br />");
  66. count++;
  67. }
  68. }
 

1.熟悉请求管道实现程序运行的全过程:

(1):BeginRequest: 开始处理请求
(2):AuthenticateRequest授权验证请求,获取用户授权信息
(3):PostAuthenticateRequest获取成功
(4): AunthorizeRequest 授权,一般来检查用户是否获得权限
(5):PostAuthorizeRequest:获得授权
(6):ResolveRequestCache:获取页面缓存结果
(7):PostResolveRequestCache 已获取缓存
(8):PostMapRequestHandler 创建页面对象
(9):AcquireRequestState

获取Session-----先判断当前页面对象是否实现了IRequiresSessionState接口,如果实现了,则从浏览器发来的请求报文体中
获得SessionID,并到服务器的Session池中获得对应的Session对象,最后赋值给HttpContext的Session属性
(10)PostAcquireRequestState 获得Session
(11)PreRequestHandlerExecute:准备执行页面对象
执行页面对象的ProcessRequest方法
(12)PostRequestHandlerExecute 执行完页面对象了
(13)ReleaseRequestState 释放请求状态
(14)PostReleaseRequestState 已释放请求状态
(15)UpdateRequestCache 更新缓存
(16)PostUpdateRequestCache 已更新缓存
(17)LogRequest 日志记录
(18)PostLogRequest 已完成日志
(19)EndRequest 完成、


 
  1. public class getsession : System.Web.UI.Page, IReadOnlySessionState
  2. {
  3. string ss = "";
  4. public void Init(HttpApplication context)
  5. {
  6. //这里可以根据需求,添加各个请求管道
  7. //获取Session
  8. context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
  9. //获取Url
  10. context.BeginRequest += new EventHandler(context_BeginRequest);
  11. }
  12. void context_AcquireRequestState(object sender, EventArgs e)
  13. {
  14. if (Session["user"] != null)
  15. {
  16. ss = Session["user"].ToString();
  17. }
  18.  
  19. }
  20. void context_BeginRequest(object sender, EventArgs e)
  21. {
  22. //获得当前页面请求管道的HttpApplication对象
  23. HttpApplication application = sender as HttpApplication;
  24. HttpContext context = application.Context;//获得上下文对象
  25. string url = context.Request.Url.LocalPath;//获得URL(不包含域名和路径)
  26. }
  27. }

运行page页面时的事件执行顺序的更多相关文章

  1. 转:运行page页面时的事件执行顺序及页面的回发与否深度了解

    using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...

  2. ASP.NET Page对象各事件执行顺序(转)

    很久没写 asp.net 的东西了,search 了一下 page 的事件执行顺序,找到如下的东西,仅仅做记录用 Page.PreInit 在页初始化开始时发生 Page.Init 当服务器控件初始化 ...

  3. Wex5页面事件执行顺序

    wex5 事件执行顺序data组件的onCustomRefresh→ model组件的onLoad→ windowReceiver组件的onReceive

  4. jquery ajax 事件执行顺序

    jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...

  5. Web高级 Eventloop和事件执行顺序

    1. EventLoop 1.1 调用栈 当一个方法执行时内部调用另外的方法,则会形成调用栈,如图: 1.2 任务队列 JavaScript有一个主线程执行当前任务,主线程的代码同步执行,并把遇到的事 ...

  6. 关于js事件执行顺序

    关于js事件执行顺序小技巧 js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 ...

  7. 关于js事件执行顺序小技巧

    js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 <button ty ...

  8. jquery ajax 中各个事件执行顺序

    jquery ajax 中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事 ...

  9. 界面主窗体,子窗体的InitializeComponent(构造函数)、Load事件执行顺序

    主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序1.执行主窗体定义事件 new函数时,同时执行主窗体构造函数,默认就一个InitializeComponent函 ...

随机推荐

  1. 【processing】小代码3

    鼠标响应: mouseX, mouseY 鼠标的坐标 ---------------------------------------------- void setup() { size(,); sm ...

  2. 【linux】vim的一些快捷键

    ctrl+y  :重复上一行内容 v+移动光标  :选择内容 y  :复制选中的内容 p  :在光标处粘贴复制的内容 ctrl+v :进入列模式,可以选择多列数据 dd :剪切一行,也可做删除一行使用

  3. 如何更改UITextField 的placeholder 的字体颜色

    storyboard 中这样设置 具体步骤: 1.在User Defined Runtime Attributes中添加一个Key. 2.输入Key Path(这里我们输入_placeholderLa ...

  4. supersr--时间显示逻辑-->NSDate+NSCalendar

    一种:时间逻辑: - (NSString *)created_at{ //    从后台返回的字符串格式:Mon Aug 03 09:17:31 +0800 2014, //NSDateFormatt ...

  5. [Usaco2015 Feb]Censoring(bzoj 3942)

    Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...

  6. iOS高效调试

    写代码难免出现bug. 储备些调试技能绝对能够提高你的工作效率,让bug无所遁形.下面就和大家分享一些我在工作中常用的iOS调试小技能. 1. 打印 最简单,基础的调试方法就是打印日志了.贴出两段封装 ...

  7. NYOJ题目198数数

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAAK1CAIAAABEvL+NAAAgAElEQVR4nO3drXLkurvv8X0T4bmQYF

  8. ReentrantLock和synchronized两种锁定机制

    ReentrantLock和synchronized两种锁定机制 >>应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicit ...

  9. ***电商数据库设计参考:ecshop数据库+订单表结构等

    ecshop订单表结构ecs_order_info说明 -- 表的结构 `ecs_order_info`    CREATE TABLE IF NOT EXISTS `ecs_order_info` ...

  10. .NET MVC4 数据验证Model(二)

      一.概述 MVC分为ViewModel.Control.View,对数据的封装MVC做的很好,确实是不错的WEB框架,针对MVC的ViewModel封装的也是相当的不错,最近做一个MVC的项目,采 ...