ASP.NET 页生命周期概述

转载自:http://msdn.microsoft.com/zh-cn/library/ms178472.aspx


一.常规页生命周期阶段

示意图:


一般来说,页要经历下表概述的各个阶段。 除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页。同时生命周期的某些部分仅当页处理为回发时才出现。

阶段

说明

页请求

页请求发生在页生命周期开始之前。 用户请求页时,ASP.NET 将确定是否需要分析和编译页
(从而开始页的生命周期),或者是否可以在不运行页的情况下发送页的缓存版本以进行响应。

启动

在启动阶段,将设置页属性,如 Request 和 Response 在此阶段,页还将确定请求是回发
请求还是新请求,并设置 IsPostBack 属性。
 页还设置 UICulture 属性。

初始化

页初始化期间,可以使用页中的控件,并将设置每个控件的 UniqueID 属性。 如果需要,还
会向页应用于母版页和主题。
 如果当前请求是回发请求,则回发数据尚未加载,并且控件属性
值尚未还原为视图状态中的值。

加载

加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属
性。

回发事件处理

如果请求是回发请求,则将调用控件事件处理程序。 之后,将调用所有验证程序控件的 
Validate 方法,此方法将设置各个验证程序控件和页的 IsValid 属性。

呈现

在呈现之前,会针对该页和所有控件保存视图状态。 在呈现阶段中,页会针对每个控件
调用 Render 方法,它会提供一个文本编写器,用于将控件的输出写入页的 Response
属性的 OutputStream 对象中。

卸载

完全呈现页并已将页发送至客户端、准备丢弃该页后,将引发 Unload 事件。 
此时,将卸载页属性(如 Response 和 Request)并执行清理。



      对应上图,我个人的理解如下:

      页请求 <----> 第1步  浏览器将整个页面作为访问请求发送给IIS服务器,同时IIS也会进行初步判断,是否需要向服务器发起请求?

      启动+初始化 <---->    第2、3步   IIS服务器先判断是否是postback操作,读取请求中的部分属性对服务器本地的页面文件进行设置(包括request、response、ispostback等),                                            同时还会初始化一些视图类的属性。注意在这个环节中,page_load方法被执行!

      加载+回发事件处理 <---->  第4、5步 IIS服务器加载请求页面中的控件值等属性混合本地页面文件进行编译和处理。在这个环节,控件自定义方法被执行。

      呈现    <---->    第6步  IIS服务器将编译好的HTML代码发送给浏览器,浏览器解释执行

     卸载  在第6步结束以后 IIS服务器清空资源

   



       

                                            


二。生命周期事件


 

在页生命周期的每个阶段中,页将引发可运行您自己的代码进行处理的事件。 对于控件事件,通过以声明方式使用特性(如 onclick)或以使用代码的方式,均可将事件处理程序绑定到事件。

页还支持自动事件连接,即,ASP.NET 将查找具有特定名称的方法,并在引发了特定事件时自动运行这些方法。 如果 @ Page 指令的 AutoEventWireup 特性设置为 true,页事件将自动绑定至使用命名约定 Page_事件(如 Page_Load 和 Page_Init)的方法。 有关自动事件连接的更多信息,请参见 ASP.NET Web 服务器控件事件模型

下表列出了最常用的页生命周期事件。 除了列出的事件外还有其他事件;不过,大多数页处理方案不使用这些事件。 而是主要由 ASP.NET 网页上的服务器控件使用,以初始化和呈现它们本身。 如果要编写自定义 ASP.NET 服务器控件,则需要详细了解这些事件。 有关创建自定义控件的信息,请参见开发自定义 ASP.NET 服务器控件

 

页事件

典型使用

PreInit

在启动阶段完成之后、初始化阶段开始之前引发。

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

  • 检查 IsPostBack 属性来确定是不是第一次处理该页。 此时还设置了 IsCallback 
    和 IsCrossPagePostBack 属性。

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

  • 动态设置主控页。

  • 动态设置 Theme 属性。

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

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

Init

在所有控件都已初始化且已应用所有外观设置后引发。 各个控件的 Init 事件在页的 Init
 事件之前发生。
使用该事件来读取或初始化控件属性。

InitComplete

在页的初始化阶段结束时引发。 Init 和 InitComplete 事件之间仅发生一个操作:开启
对视图状态更改的跟踪。
 视图状态跟踪使控件可以保留所有以编程方式添加到 
ViewState 集合的值。
 在开启视图状态跟踪之前,所有添加到视图状态的值都会在回发
期间丢失。
 控件通常在引发其 Init 事件后立即开启视图状态跟踪。使用此事件对要在
下一个回发后务必保留的视图状态进行更改。

PreLoad

在页为自身和所有控件加载视图状态之后以及处理 Request 实例包括的回发数据之后引发。

Load

Page 对象对 Page 对象调用 OnLoad 方法,然后以递归方式对每个子控件执行相同操作,
直到加载完本页和所有控件为止。
 各个控件的 Load 事件在页的 Load事件之后发生。

使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。

控件事件

使用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 
TextChanged 事件。

注意注意
在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个
验证控件的 IsValid 属性。

LoadComplete

在事件处理阶段结束时引发。

对需要加载页上的所有其他控件的任务使用该事件。

PreRender

在 Page 对象创建呈现页所需的所有控件(包括组合控件的子控件)之后引发。 
(为此,Page 对象会针对每个控件和页调用 EnsureChildControls。)
Page 
对象在 Page 对象上调用 PreRender 事件,然后以递归方式对每个子控件
执行相同操作。
 各个控件的 PreRender 事件在页的 PreRender 事件之后发生。

在呈现阶段开始之前,使用该事件对页或其控件的内容进行最后更改。

PreRenderComplete

在设置了 DataSourceID 属性的每个数据绑定控件调用其 DataBind 方法之后引发。 
有关更多信息,请参见本主题后面的数据绑定控件的数据绑定事件

SaveStateComplete

在为页和所有控件保存视图状态和控件状态之后发生。 此时对页或控件进行的任何
更改都会影响呈现,但是在下一个回发中将不会检索到这些更改。

Render

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

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

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

Unload

首先针对每个控件引发,继而针对该页引发。

在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。

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

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

 

 

 

posted on 2013-11-05 17:13  babyblue  阅读(114)  评论(0)    收藏  举报