ASP.NET 页生命周期

来源:互联网 发布:淘宝上的玛卡是真的吗 编辑:程序博客网 时间:2024/05/21 09:04

一.什么是Asp.Net页面生命周期

当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页面处理程序类后,ASP.NET 运行时将调用处理程序的 ProcessRequest 方法来处理请求,来创建页面对象。通常情况下,无需更改此方法的实现,因为它是由 Page 类提供的。接下来被创建页面对象的ProcessRequest方法使页面经历了各个阶段:初始化、加载视图状态信息和回发数据、加载页面的用户代码以及执行回发服务器端事件。之后,页面进入显示模式:收集更新的视图状态,生成 HTML 代码并随后将代码发送到输出控制台。最后,卸载页面,并认为请求处理完毕。其中页面对象ProcessRequest方法 完成的这一系列事件的处理过程就是Asp.Net页面生命周期。

二.了解Asp.Net页面生命周期的好处

了解个掌握ASP.NET页面生命周期是非常必要的,这有助于我们更加灵活的控制页面,以我们需要的方式编程开发。ASP.NET页运行时,此页会经历一个又一个的事件链,每个事件链中执行不同的行为,这所有的行为共同组成我们所需要的页面。了解了生命周期也更有助于我们对程序调试中发生问题的地方的定位。


页面生命周期

1、页面生命周期的主要阶段包括:

阶段 说明 页请求 页请求发生在页生命周期开始之前。用户请求页时,ASP.NET 将确定是否需要分析和编译页(从而开始页的生命周期),或者是否可以在不运行页的情况下发送页的缓存版本以进行响应。 开始(PreInit) 在开始阶段,将设置页属性,如 Request 和 Response。在此阶段,页还将确定请求是回发请求还是新请求,并设置 IsPostBack 属性。此外,在开始阶段期间,还将设置页的 UICulture 属性。 页初始化(Init/InitComplete/PreLoad) 页初始化期间,可以使用页中的控件,并将设置每个控件的 UniqueID 属性。此外,任何主题都将应用于页。如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。 加载 加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。 验证 在验证期间,将调用所有验证程序控件的 Validate 方法,此方法将设置各个验证程序控件和页的 IsValid 属性。 回发事件处理(LoadComplete/PreRender/SaveStateComplete) 如果请求是回发请求,则将调用所有事件处理程序。 呈现 在呈现之前,会针对该页和所有控件保存视图状态。在呈现阶段中,页会针对每个控件调用 Render 方法,它会提供一个文本编写器,用于将控件的输出写入页的 Response 属性的 OutputStream 中。 卸载 完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。此时,将卸载页属性(如 Response 和 Request)并执行清理。

2、页面生命周期的主要事件:

页事件 典型使用 PreInit 使用该事件来执行下列操作:1、检查 IsPostBack 属性来确定是不是第一次处理该页。2、创建或重新创建动态控件,设置每个控件的UniqueID 属性; 3、动态设置Master Page。4、动态设置 Theme 属性。5、读取或设置配置文件属性值。 Init 这个事件发生在所有的控件被初始化,所有的皮肤设置被应用以后。它用来读取或者初始化控件属性。它能够用来注册一些aspx页面中没有指出的控件的事件。 InitComplete 由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。 PreLoad 加载页面的ViewState和所有的控件,然后处理所有的包含在Request实例中的postback数据。 Load 这个事件可能是大家最熟悉的了。需要注意的是,Page对象会递归的调用子控件的onload事件直到页面和所有的子控件被加载完成。这个事件主要用来设置控件属性的值,建立数据库连接(通常不这么做)。 Validation 如果你的控件要求验证,验证会在这个阶段发生,这个时候你可以检查控件的IsValid属性。跟这个阶段关联的事件是Validate,它有一个可以接受验证字符串群的重载方法(overload method),这个重载方法执行特定控件群的验证。 Control events 这个就不多说了,主要是处理控件的事件,例如click。这也就让我们明白了每次我们click一个Button的时候,实际上是要先去执行load事件然后才执行click事件的,一般我们用!IsPostBack来判断一下从而避免执行不必要的加载逻辑。 LoadComplete 对需要加载页上的所有其他控件的任务使用该事件。 PreRender 在HTML被生成之前这是最后一个事件。每一个页面中的控件都有PreRender的过程。在这里对将要输出的HTML结果进行最后一次修改。 在该事件发生前: 1、Page 对象会针对每个控件和页调用 EnsureChildControls;2、设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。 SaveStateComplete 在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。 使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。 Render 这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。 UnLoad 页面中的每一个控件都会发生这件事。在控件中,使用这个事件来做清理工作,例如关闭数据库连接等。对与页面本身也是做清理工作,例如关闭打开的文件和数据库连接,或者结束日志或者其它指定的工作。

需要说明的是,每次Request都会创建一个全新的Page类的实例,所以在页面中的自己定义的字段是不能在两次request中传递值的,需要使用viewstate来存储。

转载:http://www.cnblogs.com/DotNetNuke/archive/2008/09/28/1301406.html
https://msdn.microsoft.com/zh-cn/library/ms178472(v=vs.100).aspx
http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html

原创粉丝点击