页面及控件的事件的发生先后循序分析

参考《 庖丁解牛 纵向切入ASP.NET3.5控件和组件开发技术》

页面的初始化new

 

页面

页面首先从QueryString或者Request对象的Form集合中获得回传数据。

页面

页面检测回传数据集合(NameValueCollection,Form或者QueryString)是否包含一个键为_CallBackId的项。如果存在,那么设置其Boolean属性IsCallBackTrue,以便通过AspNet客户端回调机制,标明页面已经回传到服务器

页面的PreInit事件

预初始化(PreInit):在页面生命周期的预初始化阶段执行如下操作:

a:调用OnPreInit方法引发PreInit事件。

b:利用App_Themes目录中的内容初始化主题,以动态实现一个PageTheme类型的类,编译该类,并创建一个编译类的实例,接着将实例赋值给它的PageTheme属性值

c:应用母版页

页面的IHttpHandler接口的

ProcessRequest()

Default.aspx的头部定义页面层叠样式表:

.button.table

解释Default.aspx的的服务器控件标签及其属性标签

形成完整的内存中的对象

public void ProcessRequest(HttpContext context)

调用Page

private void ProcessRequestWithNoAssert(HttpContext context)

调用Page

private void ProcessRequest()

调用Page

private void ProcessRequest

(bool includeStagesBeforeAsyncPoint,

bool includeStagesAfterAsyncPoint)

调用Page

FrameworkInitialize()

调用Page

private void __BuildControlTree(default2_aspx __ctrl)

调用Page

HtmlForm form = this.__BuildControlform1();

调用Page

Button button = this.__BuildControlButton1();

Page__BuildControlButton1()

private Button __BuildControlButton1()

{

Button button = new Button();

base.Button1 = button;

button.ApplyStyleSheetSkin(this);

button.ID = "Button1";

((IAttributeAccessor) button).SetAttribute("Style", "z-index: 100; left: 42px; position: absolute;/r/n            top: 49px");

button.Text = "Button";

return button;

}

主控件的初始化new

(见第8SignNameControl控件构造函数

初始化在进入Web请求生命周期内所需的设置;

主控件的OnInit

 

主控件的init事件

null

主控件的EnsureChildControls

 

主控件的CreateChildControls

 

主控件的CreateControlCollection

 

主控件的TrackViewState

跟踪视图状态。页面框架将调用TrackViewState方法来跟踪视图状态。需要注意的是:多数情况下,Control基类提供的TrackViewState方法实现已经足够了。只有在控件定义了复杂属性时,开发人员才可能需要重写TrackViewState方法。

页面的init事件

 

在页面生命周期的初始化阶段执行以下操作

a:递归初始化Controls集合中的控件。初始化包括设置这些控件的属性,例如:Page,IdNameContainer

b:递归应用控件皮肤

c:调用OnInit方法以引发自身的Init事件,接着递归调用子控件的OnInit方法来引发它们的Init事件

d:调用自身的TrackViewState方法来启动自身的视图状态跟踪,接着递归调用子控件的TrackViewState方法来启动它们的视图状态跟踪。

页面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方法将事件映射到了服务器端事件CommandClick上。

主控件的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事件

在页面生命周期这个阶段执行一下操作。

a:调用EnsureChildControls方法来确保在页面进入呈现阶段之前,创建其子控件。

b:调用自身的OnPreRender方法来引发PreRender事件。

c:递归调用Controls集合中控件的OnPreRender方法,以引发它们的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事件,这表示所有状态保存活动都完成了。

页面呈现

在页面生命周期的这个阶段执行一下操作。

a:创建一个HtmlTextWriter类实例,该实例封装了输出响应流

b:调用RenderControl方法,并将HtmlTextWriter实例传递给该方法。RenderControl方法递归调用子控件的RenderControl方法,以便允许每个控件能够呈现其Html标记文本。子控件的Html标记文本组成了最终发送给客户端浏览器的Html标记文本。

主控件的HasControls

 

主控件的Render事件

呈现----表示向HTTP输出流中写入标记文本的过程。开发人员通过重写Render()方法使其在输出流上自定义标记文本。

主控件的RenderContents

 

主控件的RenderChildren

 

主控件的OnUnload事件

卸载----完成的工作与"处置"阶段相同,但是,开发人员通常在Dispose()方法中执行清除,而不处理Unload事件。

主控件的Dispose事件

处置----在此阶段中,通过重写Dispose ()方法完成释放对昂贵资源的引用,如数据库链接等。

页面Unload事件

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值