Page Lift Cycle 之一: Overview
HttpHandler负责处理用户请求。对于Asp.net 页面资源的请求,当请求进入Page Handler后,Page的生命周期就开始了。Page也是事件驱动的,在其生命周期中经历不同的事件,不同的事件中处理不同的事情。一个Page页面要经历一下几个事件:
PreInit :net2.0新增事件。这是page lift cycle的入口,是唯一一个可以操控Master Page和Theme的地方,在此之后将会加载个性化信息和主题。这个事件只有Page访问,page内的control控件不能访问。
Init:初始化函数。由Page及它的子控件递归调用。调用是由层次控件树的最底层控件开始直到Page级调用。OnInit方法执行创建Page对象所需的初始化和设置步骤。在页的生命周期的此阶段,页中声明的服务器控件都已被初始化为默认状态,但没有设置视图状态。页面内的控件不可以访问其他控件,无论是父控件还是子控件。不一定会创建其他服务器控件,也不一定能访问他们。
InitComplete:net2.0新增事件。表示初始化的完成。在这个事件里开始启用asp.net的viewstate跟踪功能开启,page开始记录控件状态到viewstate。StateBag(ViewState属性的类型)默认情况下tracking功能是出于关闭状态的,可以通过调用TrackViewState()
启动。只有当tracking功能开启后,才能记录ViewState值的变化。在InitComplete函数中调用了Page.TrackViewState()开启页面视图的tracking。在生命周期的此阶段,所有控件已经被初始化,但视图状态尚未填充。可以访问其他控件,但不能获得用户返回的信息。
LoadViewState:
在页面回送时触发。这个像Init一样是个递归事件。在这个事件中,从前一页面的"__VIEWSTATE"隐藏字段中加载ViewState数据,并将状态值传递给各个控件,各个控件根据传递的值重置控件视图状态。
LoadPostBackData:在页面回送时触发。也是一个递归事件。在这个事件中,各控件回送的数据值被加载到相应的控件上。如,在页面上有个Textbox控件,输入值后回送给服务器,在该事件中就会加载回送的值,并将值赋值给Textbox的Text属性。
PreLoad:net2.0新增事件。标志着系统级初始化的结束。在此阶段之前,ViewState以及PostBack数据都已加载,所以从这个阶段开始,就可以访问服务器控件的状态及回送值了。
Load:递归事件。服务器控件加载到Page对象中时发生。Page对象调用自身Load方法,然后递归调用每个子控件的Load方法。使用OnLoad事件方法可以设置控件的属性及数据库连接。
RaisePostbackEvent:回送时触发。这个事件负责监测page的所有子控件是否有回送事件,如果有回送控件,则触发相应的事件。如:用户点击了Button控件,就会触发Click事件。
LoadComplete:2.0新增事件。加载阶段结束
PreRender:2.0新增事件。在该事件内做render前的最后更改
PreRenderComplete:2.0新增事件。标志PreRender的结束。在页生命周期的此阶段中,所有控件都已创建,并且页已做好呈现输出的准备。这是在保存页的视图状态之前调用的最后一个事件。
SaveState:递归函数。页面的ViewState被序列化到"__VIEWSTATE"隐藏字段
SaveStateComplete:2.0新增事件。ControlState记录当前 Page 对象包含的控件用于跨 Web 服务器的 HTTP 请求保留的数据。同样被序列化在"__VIEWSTATE"隐藏字段
Render:递归事件。在该事件中html回传给客户端用于生成页面
Unload:递归事件。从内存中卸载page,并释放所占资源。
参考:
http://www.codeproject.com/KB/aspnet/aspnetviewstatepagecycle.aspx