参考《 庖丁解牛 纵向切入ASP.NET3.5控件和组件开发技术》
页面的初始化new |
| |||||||||||||||
页面 | 页面首先从QueryString或者Request对象的Form集合中获得回传数据。 | |||||||||||||||
页面 | 页面检测回传数据集合(NameValueCollection,Form或者QueryString)是否包含一个键为_CallBackId的项。如果存在,那么设置其Boolean属性IsCallBack为True,以便通过AspNet客户端回调机制,标明页面已经回传到服务器。 | |||||||||||||||
页面的PreInit事件 | 预初始化(PreInit):在页面生命周期的预初始化阶段执行如下操作:
| |||||||||||||||
页面的IHttpHandler接口的 ProcessRequest() |
| |||||||||||||||
public void ProcessRequest(HttpContext context)
| ||||||||||||||||
主控件的初始化new | (见第8章SignNameControl控件构造函数) | |||||||||||||||
初始化在进入Web请求生命周期内所需的设置; | ||||||||||||||||
主控件的OnInit |
| |||||||||||||||
主控件的init事件 | (null) | |||||||||||||||
主控件的EnsureChildControls |
| |||||||||||||||
主控件的CreateChildControls |
| |||||||||||||||
主控件的CreateControlCollection |
| |||||||||||||||
主控件的TrackViewState | 跟踪视图状态。页面框架将调用TrackViewState方法来跟踪视图状态。需要注意的是:多数情况下,Control基类提供的TrackViewState方法实现已经足够了。只有在控件定义了复杂属性时,开发人员才可能需要重写TrackViewState方法。 | |||||||||||||||
页面的init事件 |
| |||||||||||||||
在页面生命周期的初始化阶段执行以下操作
| ||||||||||||||||
页面的InitComplete事件 | 页面调用OnInitComplete方法来引发InitComplete事件。该事件标明了初始化阶段的结束。此时,页面Controls集合的所有控件都被初始化了。 | |||||||||||||||
页面加载控件状态 (Load Control State)[PostBack Only] | 页面递归调用Control集合中控件的LoadControlState方法,这些控件已经调用了Page类的RegisterRequiresControlState方法,以使用它们的控件状态。 | |||||||||||||||
页面加载视图状态 (Load View State)[PostBack Only] | 页面首先调用自身的LoadViewState方法,接着递归调用Controls集合控件的LoadViewState方法,以允许它们加载它们的已经保存的视图状态。 | |||||||||||||||
主控件的LoadViewState |
| |||||||||||||||
主控件HasControls |
| |||||||||||||||
页面加载回传数据 (Load Post Data)[PostBack Only] | 页面调用实现IPostBackDataHandler接口的控件的LoadPostData方法,并将回传数据传递给该方法。每个控件的LoadPostDate方法都必须访问回传数据,并据此更新相应的控件属性。 例如:TextBox控件的LoadPostData方法将文本框的新值设置为TextBox控件的Text属性值。 | |||||||||||||||
注意: 凡是Page页面对象中的控件树中的所有控件,只要有客户端html元素name属性的表单类控件,一般都可以从提交的表单中获得数据更新。但更新的行为多数都需要该控件类实现IPostBackDataHandler接口。这点需要特别注意。最好的例子可以参见:KingControls.SignNameControl控件中的CreateChildControls()方法中的itemTracker用法。该字段隐含地让[页面加载回传数据]方法更新了该字段的值。然后再事件中提取。由于OnSaveClick事件的代码在[页面加载回传数据]方法之后执行,因此,OnSaveClick事件可以获得回调页面中包含的itemTracker字段所代表的表单数据。 | ||||||||||||||||
主控件的IPostBackDataHandler接口的 LoadPostData() | public virtual bool LoadPostData(string postDataKey, NameValueCollection postCollection) | |||||||||||||||
页面的PreLoad事件 | 页面调用OnPreLoad方法以引发PreLoad事件。该事件表示页面生命周期将进入加载阶段。 | |||||||||||||||
页面的LOAD事件 | 页面首先调用自身的OnLoad方法以引发自身的Load事件,接着递归调用Controls集合中控件的OnLoad方法以引发它们的Load事件。页面开发人员可以为Load事件注册回调,那么就可以通过编程将子控件添加到页面的Controls集合中。 | |||||||||||||||
主控件的OnLoad事件 | 至此阶段开始,控件树中的服务器控件已创建并初始化、状态已还原并且窗体控件反映了客户端的数据。此时,开发人员可以通过重写OnLoad()方法来实现每个请求共同的逻辑。 | |||||||||||||||
页面引发回传数据修改事件 (Raise Post Data Changed Event) [PostBack Only] | 页面调用控件的RaisePostDataChangeEvent方法,这些控件的LoadPostData方法返回true。 RaisePostDataChangeEvent方法引发了回传数据修改事件。例如:当文本框的新值与旧值不同时,那么TextBox控件将引发该事件。 | |||||||||||||||
主控件的IPostBackDataHandler接口的 RaisePostDataChangedEvent() | // 仅当上面方法LoadPostData返回true时,此方法将会执行 public virtual void RaisePostDataChangedEvent() { OnTextChanged(EventArgs.Empty); } | |||||||||||||||
发送回发更改通知----在此阶段,服务器控件通过引发事件作为一种信号,表明由于回发而发生的控件状态变化(因此该阶段仅用于回发过程)。为了建立这种信号,开发人员必须再次使用System.Web.UI.IPostBackDataHandler接口,并实现另一方法-RaisePostBackChangedEvent()。其判断过程为:如果控件状态因回发而更改,则LoadPostData()返回true;否则返回false。页面框架跟踪所有返回true的控件并在这些控件上调用RaisePostDataChangedEvent()。 | ||||||||||||||||
页面引发回传事件 (Raise PostBack Event)[PostBack Only] | 页面调用控件的RaisePostBackEvent方法,这些控件相关的Html元素用于提交表单。例如,Button控件的相关Html元素将页面回传到服务器。控件的RaisePostBackEvent方法必须将回传事件映射到一个或多个服务器事件。例如,Button控件的RaisePostBackEvent方法将事件映射到了服务器端事件Command和Click上。 | |||||||||||||||
主控件的IPostBackEventHandler接口的RaisePostBackEvent() | public void RaisePostBackEvent(string eventArgument) { OnClick(EventArgs.Empty); } | |||||||||||||||
处理回发事件----该阶段处理引起回发的客户端事件。为了便于将客户端事件映射到服务器端事件上进行处理,开发人员在此阶段可以通过实现System.Web.UI.IPostBackEventHandler接口的RaisePostBackEvent()方法来实现该逻辑。由此途径,服务器控件将成功捕获回发的客户端事件进行服务器端的相应处理。 | ||||||||||||||||
主控件的事件 | 处理回发事件----该阶段处理引起回发的客户端事件。为了便于将客户端事件映射到服务器端事件上进行处理,开发人员在此阶段可以通过实现System.Web.UI.IPostBackEventHandler接口的RaisePostBackEvent()方法来实现该逻辑。由此途径,服务器控件将成功捕获回发的客户端事件进行服务器端的相应处理。 | |||||||||||||||
主控件的OnBubbleEvent事件 |
| |||||||||||||||
页面的LoadComplete事件 | 页面调用OnLoadComplete方法来引发LoadComplete事件,这表示所有加载活动,包括加载回传数据,以及引发回传数据修改事件,并以更新控件自身的活动都完成了。 | |||||||||||||||
引发回调事件 (RaiseCallBack Event) (PostBack And CallBack Only) | 页面调用控件的RaiseCallBackEvent方法。该控件可使用AspNet客户端回调机制来允许客户端方法(例如JavaScript函数)调用服务器端方法,而无需将整个页面回传给服务器。 RaiseCallBackEvent方法必须调用服务器端方法。如果页面的回传使用了客户端回调机制,那么页面将不会执行剩余的页面生命周期阶段。 | |||||||||||||||
页面的PreRender事件 | 在页面生命周期这个阶段执行一下操作。
| |||||||||||||||
主控件的EnsureChildControls |
| |||||||||||||||
主控件的OnPreRender事件 | 预呈现----该阶段完成在生成控件之前所需要的任何工作。通常情况下是通过重写OnPreRender()方法完成该工作。需要注意的是:在该阶段,可以保存在预呈现阶段对控件状态所做的更改,而在呈现阶段进行的更改则会丢失。 | |||||||||||||||
页面的PreRenderComplete事件 | 页面调用OnPrerenderComplete方法来引发PreRenderComplete事件,这表示所有预呈现活动完成了。 | |||||||||||||||
页面保存控件状态(Save Control State) | 页面递归调用Controls集合中控件的SaveControlState方法。这些控件已经调用了Page类的RegisterRequiresControlState方法来保存它们的控件状态。 | |||||||||||||||
主控件的SaveControlState() |
| |||||||||||||||
页面保存视图状态(Save View State) | 页面首先调用自身的SaveViewState方法,然后调用Controls集合中的SaveViewState方法,以允许它们来保存其视图状态。 | |||||||||||||||
主控件的SaveViewState() | 保存状态----如果服务器控件不维持状态,或者它有能力通过默认方式保存其所有状态而使用ViewState字典,那么开发人员不必在该阶段实现任何逻辑。因为这个保存状态的过程是自动的。如果服务器控件需要自定义状态保存,或者控件无法在ViewState字典中存储特殊的数据类型,则需要通过重写SaveViewState()方法来实现状态保存。 | |||||||||||||||
页面的SaveStateComplete事件 | 页面调用OnSaveStateComplete方法以引发SaveStateComplete事件,这表示所有状态保存活动都完成了。 | |||||||||||||||
页面的呈现 | 在页面生命周期的这个阶段执行一下操作。
| |||||||||||||||
主控件的HasControls |
| |||||||||||||||
主控件的Render事件 | 呈现----表示向HTTP输出流中写入标记文本的过程。开发人员通过重写Render()方法使其在输出流上自定义标记文本。 | |||||||||||||||
主控件的RenderContents |
| |||||||||||||||
主控件的RenderChildren |
| |||||||||||||||
主控件的OnUnload事件 | 卸载----完成的工作与"处置"阶段相同,但是,开发人员通常在Dispose()方法中执行清除,而不处理Unload事件。 | |||||||||||||||
主控件的Dispose事件 | 处置----在此阶段中,通过重写Dispose ()方法完成释放对昂贵资源的引用,如数据库链接等。 | |||||||||||||||
页面的Unload事件 |
|