ASP.NET 页面运行时会通过生命周期来完成一系列的处理步骤。包括初始化,控件实例化,状态恢复和维护,运行事件处理代码,以及外观的呈现。了解页面生命周期是重要的,可以根据需要针对特定情景编写处理代码。另外,开发自定义控件也必须熟悉页面生命周期中正确的控件初始化指令,使用视图状态数据的控件属性,以及运行控件行为逻辑(控件的生命周期依赖于页面生命周期,因此页面会为控件引发比自己更多的事件)。
页面生命周期的一般情况
一般情况下,页面通过下表列出的情景大纲。除了页面生命周期情景之外,在请求开始和结束的时候还会发生除页面之外的应用程序情景。
情景 | 描述 |
---|---|
请求页面 |
页面请求发生在页面生命周期开始之前。当用户发送页面请求,ASP.NET 检测是否需要对页面进行处理或编译(页面生命周期由此开始),也可以直接用已缓存的页面作为回应。 |
开始 |
在该步骤中会设置页面的 |
页面初始化 |
页面初始化时,页面控件会生效并为每个控件设置 |
读入 |
读入时,如果当前请求已回传,控件属性会从视图状态和控件状态中读入。 |
验证 |
验证时会调用所有验证器的 |
处理回传事件 |
如果请求已回传,将调用所有事件处理器。 |
呈现 |
页面呈现时会保存视图状态,并将所有控件输出通过 |
卸载 |
当页面完全呈现后调用,且发送到客户端。同时,页面的 |
生命周期事件
在每个页面生命周期情景下,可以对页面引发的事件编写自定义代码进行处理。至于控件事件,则通过绑定属性(如 OnClick
)或编写代码的方式进行事件处理器绑定。
页面也支持自动事件的触发,ASP.NET 会监视并在特定事件引发后自动运行这些有特定名称的事件。如果 @ 页面指令的 AutoEventWireup
参数设置成 true(默认值为 true),页面事件就会自动绑定到以“Page_事件”格式命名的方法(如 Page_Load
和 Page_Init
)。
下表列出部分页面生命周期中的常用事件。还有一些未被列出的原因是不常用,且主要用于 ASP.NET Web 页面对控件的初始化和呈现。除非编写自定义 ASP.NET 服务器控件,就需要了解这些情景。
页面事件 | 典型用途 |
---|---|
|
注意:如果请求被回传,控件的值就不能从视图状态中恢复。在这个时候设置的控件属性,将会覆盖下一个情景中的值。 |
|
|
|
|
控件事件 |
完成应用程序处理:
|
|
|
|
完成最后的清除工作,其中包括:
注意:在卸载时,页面和控件都会重新呈现,可进一步对回应过程进行修改。如果尝试对 |
附加的页面生命周期考虑因素
请注意下列关于页面生命周期的附加信息:
-
与页面一样,每个 ASP.NET 服务器控件都拥有属于自已的生命周期。比如,控件的
Init
和Load
方法会在相应的页面事件中得到调用。而页面控件的Init
方法只能在页面Init
方法之后调用。但是,页面的Load
方法能够在控件Load
方法之前被调用。 -
通过控件事件可以自定义控件的外观和内容。比如,所有控件都引发
Init
,Load
,Unload
等事件,尽管开发者并不经常处理这些事件。但在处理控件事件时却经常需要用到(如Button
控件的Click
事件和ListBox
控件的SelectedIndexChanged
事件)。在某些情况下还有可能处理控件的DataBinding
或DataBound
事件。 -
另外,在处理页面生命周期事件时,可以重载
Page
派生类的方法。比如,重载页面的InitializeCulture
方法动态设置文化信息。创建以“Page_事件”格式命名的事件重载处理时,会先隐式调用基类的实现,因此不需要编写代码进行显式调用。比如,不管是否已经重载页面的Page_Load
方法。ASP.NET 始终会自动调用页面基类的OnLoad
方法。但是,使用override
关键字重载页面的OnLoad
方法时就需要显式调用基类的实现。比如,重载页面的OnLoad
方法时必须编写base.Load
(Visual Basic 的写法是MyBase.Load
)来明确地运行基类的实现。