ASP.NET 页生命周期概述
2010-06-11 16:52
369 查看
ASP.NET 页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤。这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。了解页生命周期非常重要,因为这样做您就能在生命周期的合适阶段编写代码,以达到预期效果。此外,如果您要开发自定义控件,就必须熟悉页生命周期,以便正确进行控件初始化,使用视图状态数据填充控件属性以及运行任何控件行为代码。(控件的生命周期基于页的生命周期,但是页引发的控件事件比单独的 ASP.NET 页中可用的事件多。)如图1-1所示
图1-1
1.
请求页
请求页发生在页生命同期开始之前。当用户请求时,ASP.NET将确定是否需要分析和编译页面,或者是否可以在不运行页的情况下输出页面缓存来进行响应。后者是通过处理@OutputCache指令来控制页面缓存策略的。
2.
开始
这个阶段用于初始化页面类的属性。用于处理用户的请求还有要回发数据库的响应的对象,Request和Response就在这个过程中设置,还根据是回发请求还是新的请求来设置IsPostBack属性,这些属性对于后面的操作是必须的。
3.
页面初始化
对应的是Page_PreInit事件。页面初始化期间可以使用控件,并将设置每个控件的UniqueID属性。此外,任何主题都将应用于页。如果当前请求是回发请求,那么我们不能在这个阶段获取控件的属性,因为此时控件属性值还未从ViewState中还原。
在这个页面级的事件中,所有在设计时创建的控件都将被用默认值做初始化。例如,如果你有一个Text属性值为”Hello”的TextBox控件,则此时这个属性被设置。这个事件仅仅发生在页级别的类中,用户控件和母版页没有这个事件,而动态设置页面主题也只能在这个事件中进行。
4.
控件加载
其对应的是Page_Init事件。在Page_Init事件中,读取或者初始化控件的属性,如果当前请求为回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。
5.
验证
在此步骤中,将调用所有的验证程序控件的Validate()方法,此方法将设置各个验证程序控件和页面的IsValid属性。
6.
页面加载
与其对应的页面事件是Page_Load事件。在Page_Load事件中,可以读取和更新控件属性,一般页面的加载都放在这个事件中去处理。有些人认为这就是Page类第一个触发的方法。这个方法是混淆我们Page生存周期的罪魁祸首之一。
注意:如果页面是回发(PostBack)的话,在Page_Load之前还会有两个进程:
加载视图状态:在这个事件中运行时隐藏域中分解出视图状态并加载到所有启用了视图状态的控件中。
加载回发数据:在这个事件里实现了IPostBackDataHandler接口的控件从HTTP的Post数据中得到值。注意,TextBox控件不能从视图状态中获得值,而是在此事件中从Post数据中获取得值。
7.
回发事件处理
如果当前请求是回发请求,则ASP.NET将会调用所有的事件处理程序。在这个上步骤中ASP.NET将会根据事件源调用不同的事件处理委托方法来处理请求。我们将在后面的ASP.NET事件模型中详细介绍。需要注意的是,事件处理(比如像Button1_Click()之类的)是定义在ASPX页面中的,有一些开发人员认为当单击一个按钮后会立即触发Button1_Click(),其实在这个事件触发之前首先要触发Page_Load。
8.
呈现
在这个步骤中,ASP.NET将会处理当前的视图状态,并将其序列化保存到页。接着调用每个控件,将其呈现通过Response.OutputStream输出。
9.
卸载
在页面完全呈现并准备丢弃时,将调用卸载,对应Page_Unload事件。在这个步骤中,将卸载Page实例并执行清理,包括如关闭打开的文件和数据库连接,完成日志记录或者其他任务。
图1-1
1.
请求页
请求页发生在页生命同期开始之前。当用户请求时,ASP.NET将确定是否需要分析和编译页面,或者是否可以在不运行页的情况下输出页面缓存来进行响应。后者是通过处理@OutputCache指令来控制页面缓存策略的。
2.
开始
这个阶段用于初始化页面类的属性。用于处理用户的请求还有要回发数据库的响应的对象,Request和Response就在这个过程中设置,还根据是回发请求还是新的请求来设置IsPostBack属性,这些属性对于后面的操作是必须的。
3.
页面初始化
对应的是Page_PreInit事件。页面初始化期间可以使用控件,并将设置每个控件的UniqueID属性。此外,任何主题都将应用于页。如果当前请求是回发请求,那么我们不能在这个阶段获取控件的属性,因为此时控件属性值还未从ViewState中还原。
在这个页面级的事件中,所有在设计时创建的控件都将被用默认值做初始化。例如,如果你有一个Text属性值为”Hello”的TextBox控件,则此时这个属性被设置。这个事件仅仅发生在页级别的类中,用户控件和母版页没有这个事件,而动态设置页面主题也只能在这个事件中进行。
4.
控件加载
其对应的是Page_Init事件。在Page_Init事件中,读取或者初始化控件的属性,如果当前请求为回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。
5.
验证
在此步骤中,将调用所有的验证程序控件的Validate()方法,此方法将设置各个验证程序控件和页面的IsValid属性。
6.
页面加载
与其对应的页面事件是Page_Load事件。在Page_Load事件中,可以读取和更新控件属性,一般页面的加载都放在这个事件中去处理。有些人认为这就是Page类第一个触发的方法。这个方法是混淆我们Page生存周期的罪魁祸首之一。
注意:如果页面是回发(PostBack)的话,在Page_Load之前还会有两个进程:
加载视图状态:在这个事件中运行时隐藏域中分解出视图状态并加载到所有启用了视图状态的控件中。
加载回发数据:在这个事件里实现了IPostBackDataHandler接口的控件从HTTP的Post数据中得到值。注意,TextBox控件不能从视图状态中获得值,而是在此事件中从Post数据中获取得值。
7.
回发事件处理
如果当前请求是回发请求,则ASP.NET将会调用所有的事件处理程序。在这个上步骤中ASP.NET将会根据事件源调用不同的事件处理委托方法来处理请求。我们将在后面的ASP.NET事件模型中详细介绍。需要注意的是,事件处理(比如像Button1_Click()之类的)是定义在ASPX页面中的,有一些开发人员认为当单击一个按钮后会立即触发Button1_Click(),其实在这个事件触发之前首先要触发Page_Load。
8.
呈现
在这个步骤中,ASP.NET将会处理当前的视图状态,并将其序列化保存到页。接着调用每个控件,将其呈现通过Response.OutputStream输出。
9.
卸载
在页面完全呈现并准备丢弃时,将调用卸载,对应Page_Unload事件。在这个步骤中,将卸载Page实例并执行清理,包括如关闭打开的文件和数据库连接,完成日志记录或者其他任务。
相关文章推荐
- ASP.NET 页生命周期概述 与 运行page页面时的事件执行顺序 【转】
- ASP.NET 页生命周期概述
- ASP.NET 页生命周期概述
- ASP.NET 页生命周期概述[msdn]
- ASP_NET生命周期概述
- ASP.NET 页生命周期概述
- ASP.NET 应用程序生命周期概述
- ASP.NET 应用程序生命周期概述
- ASP.NET页面生命周期概述(转载)
- ASP.NET 页生命周期概述
- ASP.NET 应用程序生命周期概述--转
- ASP.NET页面生命周期概述
- ASP.NET 页生命周期概述
- ASP.NET 2.0 页(Page)生命周期概述
- ASP.NET 应用程序生命周期概述
- ASP.NET 2.0 页(Page)生命周期概述
- ASP.NET 页生命周期概述
- ASP.NET 应用程序生命周期概述[来至msdn]
- ASP.NET 页生命周期概述
- IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述