ASP.NET页面生命周期与应用程序生命周期
页面生命周期
页面生命周期执行一系列步骤:页面的初始化、实例化控件、还原和维护状态、运行事件处理程序代码、呈现。为了在合适的阶段执行所需的代码,所以要对页面生命周期非常熟悉。在页生命周期的各个阶段,页面会逐个引发定义的事件,通过对代码开发,在页面的生命事件中执行我们所需要的程序
页生命周期阶段
1、 页请求:发生在页面生命周期之前,用户请求页时,ASP.NET将确定是否需要分析和编译页,从而确定是否开始页面的生命周期,或者是否可以在不运行页的情况下发送页面缓存以进行响应。
2、 开始:设置页属性,如:HttpContext以及其他属性;在此阶段,页面需要确定是回发请求还是新请求,并设置IsPostBack属性;设置页面的UICulture属性。
3、 页面初始化:加载所有主题;控件生成,并设置UniqueID;
注:ViewState、ControlState中的值还未加载至控件;如果页面是回发,则回发数据也还未加载;故此时控件可以访问,但值可能出错。
4、 加载:如果当前请求是回发请求,则为控件加载ViewState和ControlState中的值。
5、 验证:调用所有验证程序控件的Validate方法,此方法将设置验证程序控件和页的IsValid属性。
6、 回发事件处理:如果请求是回发请求,则调用所有事件处理程序。
7、 呈现:首先对该页和所有控件进行保存视图状态,然后对每个控件调用Render方法,它会提供一个文本编写器,用于将控件的输入写入页的Response属性的OutputStream中。
8、 卸载:完成呈现,并已将页发送至客户端、准备丢弃该页后,调用卸载。将卸载属性如:Response和Request等等。
页生命周期事件:
1、PreInit
ASP.net 2.0新引进的一个事件,它是生命周期的进入点。该事件激发时,页面还没有关联任何的母版页和主题。
(完成操作:检查IsPostBack属性来确定是不是第一次处理该页;
创建或重新创建动态控件
动态设置主控页
动态设置Theme属性
读取或设置配置文件属性
注:如果请求是回发请求,则控件的值尚未从视图状态恢复,即:不应该在此事件中设置控件属性。)
2、Init
此时会遍历页面上的所有的子控件,使他们以一种上下文相关的方法寝化他们的状态。所有的子控件递归地调用他们的OnInt方法。
(完成操作:在所有控件都已经初始化并且应用所有外观设置后引发。使用该事件来读取和初始化控件属性。)
3、InitComplete
该事件是只有页面才有的事件,它也是ASP.net 2.0新引进的一个事件。它表明初始化子阶段的结束。对一个页面而言,在init事件和InitComplete事件之间只发生一个操作:打开视图状态(ViewState)变更的跟踪功能。跟踪视图状态是这样一个操作,它最终是控件能够真正的把所有以编程方式添加到ViewState集合中的数值持久的存储在存储介质中。简单的讲,对于没有跟踪视图状态的控件,任何添加到ViewState的值将会在下一次回发时丢失。
(完成操作:由Page对象引发,使用该事件来处理要求完成所有初始化工作的任务。)
4、PreLoad
该事件指明页面已经结束系统级初始化阶段,并且准备进入下一个阶段,即还有机会在该页面中的用户代码中进一步配置页面的执行和呈现,该事件只针对页面引发。
(完成操作:为页和所有控件加载视图状态,然后处理Request 实例包括的任何回发数据。
注:如果需要在Load之前对页或控件进行处理,需要该事件。)
5、Load
Load事件首先针对页面引发,然后递归地针对所有的子控件引发。页面树中的控件在此时创建,并且他们的状态完全反映前一个状态以及从客户端发送的任何数据。页面准备执行所有与页面逻辑和行为有关的初始化代码。
(完成操作:以递归方式加载所有控件。)
6、LoadComplete
加载完毕,此时程序执行结果已经加载到内存中。
7、PreRender
预呈现,通过处理该事件,页面和控件可以在呈现输出之前执行任何更新。PreRender事件首先为页面激发,然后递归的为控件激发。
注:这个页面保证创建所有的子控件。在该事件发生前的操作:
Page对所有控件递归进行EnsureChildControl操作
设置了DataSourceID属性的数据绑定控件会调用DataBind方法。
8、PreRenderComplete事件
预呈现完毕,由于PreRender事件是递归地为所有的子控件激发的,所以无法知道何时完成预呈现阶段,所以在asp.net2.0中加入了这样一个只为页面激发的事件。
9、SaveState事件
保存视图状态,在呈现每个控件以生成页面的html标记之前,把页面的当前状态保存在视图状态存储。
10、SaveStateComplete
视图状态保存完毕。
(在该事件发生前,已经对控件的ViewState进行了保存。将忽略对页和控件所作的所有修改。)
11、Render
页面呈现,输出html格式的页面。
12、控件事件
完成操作:处理控件引发的事件。
注:在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查Page和各个验证控件的IsValid属性。
应用程序生命周期
在应用程序的生命周期期间,应用程序会引发可处理的事件并调用可重写的特定方法。若要处理应用程序事件或方法,可以在应用程序根目录中创建一个名为 Global.asax 的文件。如果创建了 Global.asax 文件,ASP.NET 会将其编译为从 HttpApplication 类派生的类,然后使用该派生类表示应用程序。
HttpApplication 进程的一个实例每次只处理一个请求。由于在访问应用程序类中的非静态成员时不需要将其锁定,这样可以简化应用程序的事件处理过程。这样还可以将特定于请求的数据存储在应用程序类的非静态成员中。例如,可以在 Global.asax 文件中定义一个属性,然后为该属性赋一个特定于请求的值。
Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。在应用程序域的生命周期期间,ASP.NET 仅调用这些方法一次,而不是对每个 HttpApplication 实例都调用一次。