ASP.NET2.0生命周期

页面的生命周期统一分为3个阶段:建立阶段、回发阶段、结束阶段

当然开始还是:客户端请求页面,这是HTTP运行库激活ProcessRequest(即:Page类的ProcessRequest方法)启动页面并控制生命期。

(注:以下时间红色的表示ASP.NET2.0新引入的)

建立阶段:

1.PreInit事件 :这是页面周期的进入点。所有在设计时创建的控件都将被用默认值做初始化。由于在这个时间触发的时候,页面还没有关联任何母板页和主题,因此只有这个时候才可以通过编程方式修改母版页和主题。还有需要注意一点,如果一个页有其相关联的母版页的话,那么在PreInit()事件里页中的所有控件都不会被初始化。而只有在Init()事件开始之后,你才能直接访问这些控件。

典型使用场景:

使用该事件来执行下列操作:

  • 检查 IsPostBack 属性来确定是不是第一次处理该页。

  • 创建或重新创建动态控件。

  • 动态设置主控页。

  • 动态设置 Theme 属性。

  • 读取或设置配置文件属性值。

    Note 注意

    如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被重写。

2.Init事件:这个时候,母版页和主题都已经设置并无法修改了。ProcessRequest方法遍历页面所有的子控件,递归的调用它们的OnInit方法,注意这里是从里到外的顺序进行。在这个事件里,我们能读出控件的属性(在设计模式中设置的)。但是我们不能读出用户设置的值,因为得到用户设置的值是在LoadPostData()事件被激发之后。

3.InitComplete事件 :该事件表明初始化子阶段的结束。在Init事件与InitComplete事件之间只发生一个操作:打开视图状态变更的跟踪功能。也就是说在InitComplete前写入ViewState集合的任何值在下一次回发时不再有用。

4.LoadViewState,视图状态恢复,即载入ViewState: _VIEWSTATE隐藏字段保存着一个请求结束时所有控件的视图状态,在这里则恢复_VIEWSTATE隐藏字段的内容,当然前提是控件启用了ViewState属性。这个事件仅仅在回发之后被激发(IsPostBack == true)。

5.LoadPostData,处理回送数据(IPostBackDataHandler):这时处理HTTP请求中的所有客户数据,即<form>标签内所有输入字段的内容,根据回送的数据刷新控件的状态。

投递的数据通常是以这样的格式:TextBox1=text&DropDownList1=selectedItem&Button1=Submit

这些值被装入一个内部集合,页面处理器将数据集合中名称和页面中的控件ID进行匹配。没找到一个,看是否实现了IPostBackDataHandler 接口,如果实现了即调用接口中的LoadPostData 方法。

另一个重要的知识点是如果我们有一个DropDownList控件并动态的给它增加一些选择项,那么runtime将不能得到这些值除非启用了view state(即使控件继承自IPostBackDataHandler接口)。这个原因就是在HTTP的POST数据中的每一个控件只能有一个值,并且POST数据中的所有值都不会被保存,除了使用view state。

6.PreLoad事件 :它只是指明页面已经结束系统级初始化阶段,并准备进入下一阶段。该事件只针对页面,如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。

7.Load事件:在此可执行所有与页面逻辑和行为有关的初始化代码。注意:如果页里有任何用户控件的话,那么用户控件的Load方法将在页类的Load方法之后被触发。除了Init()和Unload()之外的所有事件都是从最外面到最里面被激发的。所以页的Page_Load()之后,页内的其它控件的Load方法才被触发。

8. Control Event Handlers
事件处理(比如像Button1_Click()之类的)是定义在ASPX页面中的,有一些开发人员认为当单击一个按钮后会立即出发Button_Click() ,他们忘了在这个事件触发之前首先要触发Page_Load。

9.LoadComplete事件

该事件表明页面准备阶段的结束,激发LoadComplete 事件后,页面进入呈现阶段。

10.PreRender事件

通过这个事件,页面和控件可以在呈现输出之前执行任何更新,该事件首先由页面激发,然后递归的为控件激发。

在该事件发生前:

页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。

11.PreRenderComplete事件

该事件表明页面预呈现阶段的结束。

12.SaveStateComplete事件

在该事件发生前,已针对页和所有控件保存了 ViewState 。将忽略此时对页或控件进行的任何更改。

使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。

13.Render

这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。

如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件

用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。

14.Unload事件

该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。

对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。

注意:在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常

posted @ 2010-04-21 21:35  北纬28.33  阅读(161)  评论(0编辑  收藏  举报