运行page页面时的事件执行顺序
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- public partial class _Default : Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- }
- #region OnPreInit 第一步
- protected override void OnPreInit(EventArgs e)
- {
- //检查 IsPostBack 属性来确定是不是第一次处理该页。
- //创建或重新创建动态控件。
- //动态设置主控页。
- //动态设置 Theme 属性。
- //读取或设置配置文件属性值。
- //注意
- //如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被重写。
- base.OnPreInit(e);
- }
- #endregion
- #region OnInit 第二步
- protected override void OnInit(EventArgs e)
- {
- //在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。
- base.OnInit(e);
- }
- #endregion
- #region OnInitComplete 第三步
- protected override void OnInitComplete(EventArgs e)
- {
- //由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。
- base.OnInitComplete(e);
- }
- #endregion
- #region PreLoad 第四步
- protected override void OnPreLoad(EventArgs e)
- {
- //如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。
- //在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。
- base.OnPreLoad(e);
- }
- #endregion
- #region OnLoad 第五步
- protected override void OnLoad(EventArgs e)
- {
- //Page 在 Page 上调用 OnLoad 事件方法,然后以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。
- //使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。
- base.OnLoad(e);
- }
- #endregion
- #region 控件事件 第六步
- protected void Button1_Click(object sender, EventArgs e)
- {
- //用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
- //注意
- //在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。
- }
- #endregion
- #region OnLoadComplete 第七步
- protected override void OnLoadComplete(EventArgs e)
- {
- //对需要加载页上的所有其他控件的任务使用该事件。
- base.OnLoadComplete(e);
- }
- #endregion
- #region OnPreRender 第八步
- protected override void OnPreRender(EventArgs e)
- {
- //在该事件发生前:
- //Page 对象会针对每个控件和页调用 EnsureChildControls。
- //设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息,请参见下面的数据绑定控件的数据绑定事件。
- //页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。
- base.OnPreRender(e);
- }
- #endregion
- #region SaveStateComplete 第九步
- protected override void OnSaveStateComplete(EventArgs e)
- {
- //在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。
- //使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。
- base.OnSaveStateComplete(e);
- }
- #endregion
- #region Render 第十步
- //Render
- //这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。
- //如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件。
- //用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。
- #endregion
- #region OnUnload 第十一步
- protected override void OnUnload(EventArgs e)
- {
- //该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。
- //对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。
- //注意www.2cto.com
- //在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。
- base.OnUnload(e);
- }
- #endregion
- }
当页面进行回发时,如点击按钮,以上事件都会重新执行一次,这时的执行顺序为:
1. OnPreInit
2. OnInit
3. OnInitComplete
4. OnPreLoad
5. Page_Load
6. OnLoad
7. Button_Click
8. OnLoadComplete
9. OnPreRender
可以看到,Button_Click事件位于OnLoad之后执行,可以测试一下:
- public partial class TestControls : System.Web.UI.Page
- {
- static int count = 0;
- protected void Page_Load(object sender, EventArgs e)
- {
- Response.Write(count+ "Page_Load <br />");
- count++;
- }
- protected override void OnPreInit(EventArgs e)
- {
- base.OnPreInit(e);
- Response.Write(count + "OnPreInit <br />");
- count++;
- }
- protected override void OnInit(EventArgs e)
- {
- base.OnInit(e);
- Response.Write(count + "OnInit <br />");
- count++;
- }
- protected override void OnLoad(EventArgs e)
- {
- base.OnLoad(e);
- Response.Write(count + "OnLoad <br />");
- count++;
- }
- protected override void OnPreLoad(EventArgs e)
- {
- base.OnPreLoad(e);
- Response.Write(count + "OnPreLoad <br />");
- count++;
- }
- protected override void OnLoadComplete(EventArgs e)
- {
- base.OnLoadComplete(e);
- Response.Write(count + "OnLoadComplete <br />");
- count++;
- }
- protected override void OnInitComplete(EventArgs e)
- {
- base.OnInitComplete(e);
- Response.Write(count + "OnInitComplete <br />");
- count++;
- }
- protected override void OnUnload(EventArgs e)
- {
- base.OnUnload(e);
- }
- protected override void OnDataBinding(EventArgs e)
- {
- base.OnDataBinding(e);
- Response.Write(count + "OnDataBinding <br />");
- count++;
- }
- protected override void OnPreRender(EventArgs e)
- {
- base.OnPreRender(e);
- Response.Write(count + "OnPreRender <br />");
- count++;
- }
- protected void btnGraphics_Click(object sender, EventArgs e)
- {
- //Bitmap bmp = new Bitmap(10, 10);
- //Graphics g = Graphics.FromImage(bmp);
- Response.Write(count + "btnGraphics_Click <br />");
- count++;
- }
- }
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 完成、
- public class getsession : System.Web.UI.Page, IReadOnlySessionState
- {
- string ss = "";
- public void Init(HttpApplication context)
- {
- //这里可以根据需求,添加各个请求管道
- //获取Session
- context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
- //获取Url
- context.BeginRequest += new EventHandler(context_BeginRequest);
- }
- void context_AcquireRequestState(object sender, EventArgs e)
- {
- if (Session["user"] != null)
- {
- ss = Session["user"].ToString();
- }
- }
- void context_BeginRequest(object sender, EventArgs e)
- {
- //获得当前页面请求管道的HttpApplication对象
- HttpApplication application = sender as HttpApplication;
- HttpContext context = application.Context;//获得上下文对象
- string url = context.Request.Url.LocalPath;//获得URL(不包含域名和路径)
- }
- }
运行page页面时的事件执行顺序的更多相关文章
- 转:运行page页面时的事件执行顺序及页面的回发与否深度了解
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Secu ...
- ASP.NET Page对象各事件执行顺序(转)
很久没写 asp.net 的东西了,search 了一下 page 的事件执行顺序,找到如下的东西,仅仅做记录用 Page.PreInit 在页初始化开始时发生 Page.Init 当服务器控件初始化 ...
- Wex5页面事件执行顺序
wex5 事件执行顺序data组件的onCustomRefresh→ model组件的onLoad→ windowReceiver组件的onReceive
- jquery ajax 事件执行顺序
jquery中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事件) 6.e ...
- Web高级 Eventloop和事件执行顺序
1. EventLoop 1.1 调用栈 当一个方法执行时内部调用另外的方法,则会形成调用栈,如图: 1.2 任务队列 JavaScript有一个主线程执行当前任务,主线程的代码同步执行,并把遇到的事 ...
- 关于js事件执行顺序
关于js事件执行顺序小技巧 js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 ...
- 关于js事件执行顺序小技巧
js事件执行顺序是js中一个老生常谈的一个话题, 聊这个话题之前我们先谈谈怎么给页面元素绑定我们需要的事件 1.给页面元素绑定事件 a)直接在元素上面加上需要绑定的事件,如 <button ty ...
- jquery ajax 中各个事件执行顺序
jquery ajax 中各个事件执行顺序如下: 1.ajaxStart(全局事件) 2.beforeSend 3.ajaxSend(全局事件) 4.success 5.ajaxSuccess(全局事 ...
- 界面主窗体,子窗体的InitializeComponent(构造函数)、Load事件执行顺序
主窗体,子窗体的InitializeComponent(构造函数).Load事件执行顺序1.执行主窗体定义事件 new函数时,同时执行主窗体构造函数,默认就一个InitializeComponent函 ...
随机推荐
- 【processing】小代码3
鼠标响应: mouseX, mouseY 鼠标的坐标 ---------------------------------------------- void setup() { size(,); sm ...
- 【linux】vim的一些快捷键
ctrl+y :重复上一行内容 v+移动光标 :选择内容 y :复制选中的内容 p :在光标处粘贴复制的内容 ctrl+v :进入列模式,可以选择多列数据 dd :剪切一行,也可做删除一行使用
- 如何更改UITextField 的placeholder 的字体颜色
storyboard 中这样设置 具体步骤: 1.在User Defined Runtime Attributes中添加一个Key. 2.输入Key Path(这里我们输入_placeholderLa ...
- supersr--时间显示逻辑-->NSDate+NSCalendar
一种:时间逻辑: - (NSString *)created_at{ // 从后台返回的字符串格式:Mon Aug 03 09:17:31 +0800 2014, //NSDateFormatt ...
- [Usaco2015 Feb]Censoring(bzoj 3942)
Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...
- iOS高效调试
写代码难免出现bug. 储备些调试技能绝对能够提高你的工作效率,让bug无所遁形.下面就和大家分享一些我在工作中常用的iOS调试小技能. 1. 打印 最简单,基础的调试方法就是打印日志了.贴出两段封装 ...
- NYOJ题目198数数
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsYAAAK1CAIAAABEvL+NAAAgAElEQVR4nO3drXLkurvv8X0T4bmQYF
- ReentrantLock和synchronized两种锁定机制
ReentrantLock和synchronized两种锁定机制 >>应用synchronized同步锁 把代码块声明为 synchronized,使得该代码具有 原子性(atomicit ...
- ***电商数据库设计参考:ecshop数据库+订单表结构等
ecshop订单表结构ecs_order_info说明 -- 表的结构 `ecs_order_info` CREATE TABLE IF NOT EXISTS `ecs_order_info` ...
- .NET MVC4 数据验证Model(二)
一.概述 MVC分为ViewModel.Control.View,对数据的封装MVC做的很好,确实是不错的WEB框架,针对MVC的ViewModel封装的也是相当的不错,最近做一个MVC的项目,采 ...