本文我们将会讨论asp.net page 生命周期事件,在网上一搜发现一大堆,但是只是给出了顺序,然而本文根据asp.net高级编程中的资料,对其顺序,事件的描述、用法作出一些简单的总结,希望可以帮助到想要了解asp.net page 生命周期的读者。
一个asp.net web应用生命周期可以分为三个level:
1. 应用程序(application) level(例如---global.asax中的Session_Start 事件)
2. Page 或者 webform level(例如--Page_Load)
3. control level( 例如--下拉列表的Selected index chaged 事件)
温馨提示:control level会在下一篇文章中讨论
我们都知道网页应用都是基于无状态协议的。对于webform的每次请求,事件都会按照下面的顺序发生
1.web application 创建一个webform请求实例
2.处理webform的事件
3.生成HTML代码,并且把html响应给请求客户端
4.webform销毁,释放内存
下面是一些常用的asp.net webform生命周期中的事件,除了error 事件,其他事件按顺序触发,因为error 事件仅仅会发生异常,并且异常没被处理时触发。
Preinit - 就如事件名称表示,发生在页面开始初始化。IsPostBack,IsCallback,IsCrossPagePostBack 等属性就是在这阶段设置的。我们通常可以在这里动态设置master page和网页主题。所以Preinit 经常被用于一些动态控制。
Init - 页面初始化 ,在web窗体上的控件的init 事件后触发,可以使用这个事件来读取或者初始化控件的属性。服务器控件会根据web窗体中 view state来初始化。因此viewstate会在这事件中重新被保存。
InitComplete - 事件在页面初始化完成后触发
PreLoad - 触发在Page Load事件之前
Load - Page Load事件,发生在web窗体控件的load事件之前
Control Events - 在 Page load 事件之后, 按钮点击、下拉框index改变等事件
Load Complete - 当控制事件(Control Events)被处理后,这事件会被调用
PreRender - 在渲染网页之前触发
PreRenderComplete - 仅仅跟着PreRender 完成后触发
Unload - 在这阶段释放内存
Error - 如果发生未被捕获的异常,这事件会被触发
为了看清楚事件的执行顺序,创建了一个asp.net项目,然后写了如下代码:
protected void Page_PreInit(object sender, EventArgs e)
{ Response.Write("Page_PreInit" + "
"); }
protected void Page_Init(object sender, EventArgs e)
{ Response.Write("Page_Init" + "
"); }
protected void Page_InitComplete(object sender, EventArgs e)
{ Response.Write("Page_InitComplete" + "
"); }
protected void Page_PreLoad(object sender, EventArgs e)
{ Response.Write("Page_PreLoad" + "
"); }
protected void Page_LoadComplete(object sender, EventArgs e)
{ Response.Write("Page_LoadComplete" + "
"); }
protected void Page_PreRender(object sender, EventArgs e)
{ Response.Write("Page_PreRender" + "
"); }
protected void Page_PreRenderComplete(object sender, EventArgs e)
{ Response.Write("Page_PreRenderComplete" + "
"); }
protected void Page_Unload(object sender, EventArgs e)
{
//Response.Write("Page_Unload" + "
");
}
Page_PreInit
Page_Init
Page_InitComplete
Page_PreLoad
Page_LoadComplete
Page_PreRender
Page_PreRenderComplete
如果取消Page_Unload()中的注释,将会得到System.Web.HttpException 异常,这是因为这事件是页面完全渲染后才触发,所以所有的响应消息(如:html代码)已经发送给了客户端,web窗体实例已经不可用了,因此web实例中的Response 和 Request属性已经被清理了