在生命周期中将执行一系列处理步骤,这些步骤包括:
•实例化
(Instantiate)
控件被页面或另一个控件通过调用它的构造器所实例化。这个步骤之后所列出的阶段,仅当控件加入控件树中才会发生。
•初始化
(Initialize)
初始化在传入
Web 请求生命周期内所需的设置。在此阶段,控件树中的页面和全部控件通过默认方式来调用
OnInit方法。开发人员可以通过重载
OnInit方法,为控件提供
初始化逻辑。在其生命周期的这个时候,控件能够安全地访问其置于
Controls集合中的子控件,但是它不能访问控件层次中的父控件或其他层次更高的控件
(如页面)
•开始跟踪视图状态
(Begin
Tracking View State)
这个阶段发生在初始化阶段的末尾。在此阶段页面自动调用
TrackViewState方法。
TrackViewState方法保证在此阶段之后,
使用
ViewState字典属性而产生的变化保存在控件视图状态中。在大多数情况下,
Control基类提供的
TrackViewState方法实现已经
足够了,只有在控件定义了复杂属性时,才必须重载
TrackViewState方法。
•加载视图状态(仅用于回传过程)
(Load
View State (postback only))
这个阶段发生在回传时,而不是初始请求过程中,在此阶段结束时,就会自动填充控件的
ViewState 属性控件可以重写
LoadViewState 方法的默认实现,以自定义状态还原。
•加载回传数据(仅用于回传过程,为可选项)
(Load
Postback Data(postback only, optional))
只有在控件通过实现
IPostBackDataHandler接口参与了回传数据处理时,这个阶段才发生在回传中。
TextBox控件就是一个例
子。在这个阶段中,控件必须从已发送的表单数据中,通过实现
IPostBackDataHandler借口的
LoadPostData方法更新其状态。
•加载
(Load)
直到此阶段开始,控件树中的所有控件都已被初始化,并恢复到它们在先前周期最后的状态。 OnLoad方法会执行所有请求共有的操作,如设置数据库 查询。此时,树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。如果需要实现仅在页面初始请求中执行的逻辑,那么实现该逻辑 时,应该检查页面的 IsPostBack属性
•引发修改事件(仅用于回传过程,为可选项)
(Raise
Changed Events(postback only, optional))
只有在控件通过实现 IPostBackDataHandler接口参与了回传数据处理时,这个阶段才发生在回传中。在此阶段中,控件通过引发事件 (如 TextBox的 TextChanged事件)作为一种信号 -----其状态由于回传而改变(引发更改事件以响应当前和以前回发之间的状态更改)。为 了参与此阶段,控件必须实现 IPostBackDataHandler接口的 RaisePostDataChangedEvent方法。
•引发回传事件(仅用于回传过程,为可选项)
(Raise
Postback Events(postback only, optional))
只有在控件通过实现 IPostBackEventHandler接口参与了回传数据处理时,这个阶段才发生在回传中。在此阶段可以通过实现 IPostBackEventHandler接口的 RaisePostBackEvent方法来实现逻辑,以便把客户端事件映射到服务器端事件。
•预生成
(PreRender)
在此阶段中,应该通过重载 OnPreRender方法,执行在生成控件之前所需要的任何工作。在生成输出之前执行任何更新,可以保存在预生成阶段对控件状态所做的更改,而在生成阶段所对应的更改则会丢失。
•保存视图状态
(Save
View State)
如果控件不维持状态,或者它为保存其所有状态信息而使用 ViewState字典,那么不必在此阶段期间实现任何附加逻辑。在此阶段期间,页面框架 会自动保存 ViewState字典。如果需要自定义状态管理,必须通过重载 SaveViewState方法来实现自定义状态恢复,这种方法只被 EnableViewState属性为 true的控件所调用。在此阶段以后任何控件的改变都不会保存在控件的视图状态中。
•生成
(Render)
通过这种方法,控件在输出流上通过重载 Control的 Render方法或 WebControl类的 rendering方法中的一种,来写标记文本。
•卸载
(Unload)
在此阶段中,页面通过实现 Page_Unload方法,来执行清除工作。作为控件开发者,应该重载 Dispose方法来执行清除。
•释放
(Dispose)
在此阶段,应该重载 Dispose方法来释放控件所占的全部资源。
各阶段对应的事件方法如图: