ASP.NET一个页面的生命周期
在学习ASP.NET页面生命周期前,需要先了解之前的ASP.NET的基本运行机制,在理解ASP.NET基本运行机制原理后,下面将介绍ASP.NET的生命周期中,页面从创建到处理结束的过程中ASP.NET Engine执行的10个事件.
1.对象初始化
页面自身以及页面中的控件,都是在Form中被首次初始化的,初始化事件可以通过OnInit()方法重载.通过在ASPX页面的后台代码文件的构 造器中声明对象,页面将知道对象的类型,并知道需要创建多少个这样的对象.一旦在构造器中声明了控件,就可以在其任何子类 事件 方法 或属性中访问到它们.但是,如果对象实在ASPX文件中指定的控件,由于这样的控件是没有属性的,并且这样做对从代码中访问它们是危险的,所以无法保证这 些控件实例是按照怎样的顺序被创建的.
2.加载视图状态数据
初始化之后,因为还没有建立用于相对引用的文档对象模型,所以控件仅能通过ID引用.在LoadViewState事件中,已初始化的控件获得第一 个属性,即上一次提交存留到服务器的视图状态信息.页视图状态通过ASP.NET维护,通常被用于在一个往返行程中存留信息到服务器.视图状态信息以一个 名称/值对的形式进行保存,它包含控件的Text和Value这一类信息.视图信息在页请求中进行传递,通常保存在隐藏<input>控件的 值属性中.这个事件可以通过LoadViewState()方法重载,往往用于在控件被填充时定制它所接受的数据.
3.LoadPostData处理回传数据
在创建页的阶段,被发送到服务器端的Form数据(也被称为回传数据)依照每个控件的数据需求进行处理.当页面提交Form时,框架将在每个提交数 据的控件上实现IPostBackDataHandler接口.随后,页面激发LoadPostData事件,通过页面解析发现实现了 IPostBackDataHandler接口的控件,并用正确的回传数据更新控件状态.ASP.NET更新正确的控件是通过匹配控件的唯一标示符来实现 的,该标识符具有名称值集合中的名称值对.
注意:在所有特定的页中,每个控件都需要一个唯一标示符.框架来完成其它的步骤,以确定每个标示符在环境中是唯一的.例如,存在于单页面中的自定义用户控件.LoadPostData事件被激发后,RaisePostDataChanged事件就可以随时被执行了.
4.对象加载
大部分的工作都是在这一阶段完成的.对象在load事件中获得正确的Form,Load事件能够通过调用OnLoad()方法来重载.首先,所有的 对象都被组织在页DOM(也称为控件树)中,并且很容易通过代码或相对位置来引用.然后对象就可以自由地访问HTML中的客户端属性集,如width value或者visibility.当加载时,控件逻辑(如算法)以编程方式设置控件属性.用StringBuilder装配输出字符串都同时被执行.
5.激发RaisePostDataChanged事件
如前所述,这发生在所有实现了IPostBackDataHandler接口的控件被正确的回传数据更新以后.在这个过程中,每个控件都有一个布尔值的
标识,标识其自上一次提交后该控件的数据是否被修改.然后ASP.NET通过搜索页来寻找任何显示控件数据被更改的标识,并激发
RaisePostDataChanged事件.
注意:这个事件知道Load事件发生后,所有控件被更新后才激发.这个机制可以保证在控件被回传数据更新前,其它控件的数据在RaisePostDataChanged事件中没有被手动更改过.
6.处理客户端回传事件
当回传更新导致数据改变而引发服务器端事件后,引发回传的对象会在RaisePostBackEvent事件中被处理.这种激发回传的对象往往是其状态
改变而引发回传的控件(其autopostback被启用)或者是一个被单击的窗体提交按钮.很多代码都在这个事件中执行,因为这是控制事件驱动逻辑的理
想位置.为了保证呈现到浏览器中的数据的正确性,在一系列的回传事件后,RaisePostBackEvent事件最终被激发.基于一致性的考虑,回传中
改变的控件直到这个函数被执行后才被更新.也就是说,被预期事件改变的数据总是在结果页反映出来.RaisePostBackEvent事件也可以通过
RaisePostBackEvent来捕捉.
7.对象预呈现
对象被预呈现的地方,对于那些能够保存到视图或者维持其视图状态的对象来说,是最后一次有机会改变的地方.这使得预呈现步骤成为做最后修改的理想位置,例
如,改变控件属性或改变控件树结构,则不用担心因为数据库请求或者视图状态更新而导致对象的变化.预呈现阶段之后,对象改变被锁定,并且不能再被保存到页
视图状态中.预呈现阶段可以通过重载OnPreRender实现.
8.保存视图状态
只有在所有的页面对象的改变都发生后视图状态才被保存.对象状态数据被保存在隐藏(input)对象中,这也是对象状态数据准备呈现到HTML的地方.在
SaveViewState事件中,值能够被保存到视图状态对象中,但页面控件的改变并不能保存到其中.可以通过重载SaveViewState实现这个步骤.
9.呈现HTML
页
的创建是通过Render事件装配用于浏览器输出的HTML来进行的,Render事件可以被重载.在Render事件中,页调用对象使它们呈现为
HTML,然后页手机HTML来进行发送.当Render事件被重载的时候,程序员可以为浏览器创建定制的HTML,此时页面创建的任何HTML都还没有
生效.Render()方法用HTMLTextWriter对象作为参数,并由它产生HTML给浏览器.这里仍然可以作修改,但是这样的修改只会反映到客
户,也就是说,改变只会在HTML呈现中反映,而视图状态并无法改变.
10.释放
当呈现页面的HTML后,对象将被释放.在Dispose事件中,我们可以清楚任何在页面中创建中构造的对象或者引用.在这里,所有的处理都已经被执行,程序员可以安全地释放任何还存在的对象,包括Page对象.
在
ASP.NET的页面生命周期中需要经历
Page_Init,LoadViewState,LoadPostData,Page_Load,RaisePostDataChanged,RaisePostBackEvent,Page_PreRender,SaveViewState,Page_Render,UnLoad
这10个事件.每一个ASP.NET页面生命周期,都经历着同样的过程:从初始化对象到销毁对象.通过了解ASP.NET页面的生命周期,我们可以在编写
调试代码的时候更好的地把握这些事件之间的关系.
ASP.NET一个页面的生命周期的更多相关文章
- (转)教你记住ASP.NET WebForm页面的生命周期
对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...
- 教你记住ASP.NET WebForm页面的生命周期
对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...
- 【Framework】深入研究Asp.net页面的生命周期
介绍 Asp.net是微软.Net战略的一个组成部分.它相对以前的Asp有了很大的发展,引入了许多的新机制.本文就Asp.net页面的生命周期向大家做一个初步的介绍,以期能起到指导大家更好.更灵活地操 ...
- 详解ASP.NET MVC的请求生命周期
本文的目的旨在详细描述asp.net mvc请求从开始到结束的每一个过程. 我希望能理解在浏览器输入url并敲击回车来请求一个asp.net mvc网站的页面之后发生的任何事情. 为什么需要关心这些? ...
- Asp.net MVC 之请求生命周期
今天主要试着描述一下ASP.NET MVC 请求从开始到结束的整个生命周期,了解这些后,对MVC会有一个整体的认识. 这里主要研究了MVC请求的五个过程. 1.创建RouteTable 当ASP.NE ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(13-19)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12) ",体验了7-12关键环节,本篇继续. ⒀当请求到达UrlRoutingModule的时候,Url ...
- ASP.NET MVC的请求生命周期
我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有两个原因.首先是因为ASP.NET MVC是一个扩展性非常强的框架.例如, ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6)
ASP.NET和ASP.NET MVC的HttpApplication请求处理管道有共同的部分和不同之处,本系列将体验ASP.NET MVC请求处理管道生命周期的19个关键环节. ①以IIS6.0为例 ...
- ASP.NET MVC请求处理管道生命周期的19个关键环节(7-12)
在上一篇"ASP.NET MVC请求处理管道生命周期的19个关键环节(1-6) ",体验了1-6关键环节,本篇继续. ⑦根据IsapiWorkerRequest对象,HttpRun ...
随机推荐
- 在iOS中使用icon font
博文转载至 http://www.cocoachina.com/industry/20131111/7327.html 在开发阿里数据iOS版客户端的时候,由于项目进度很紧,项目里的所有图标都是用最平 ...
- .net 将DLL程序集生成到指定目录中
.在程序集右键属性 .在程序集属性界面中找到生成事件 在预先生成事件命令行添加: IF NOT EXIST "$(ProjectDir)..\Bin" MD "$(Pro ...
- 解决Win7启动时出现“windows未能启动。原因可能是最近更改了硬件或软件”的问题
昨天公司终于大发慈悲,统一更换电脑配置,终于要摆脱“手扶拖拉机”的时代了,赶上“动车时代”了.不过不想换硬盘,因为重新要安装太多东西,环境配置一大堆,所以就硬盘没有换,不过当我开机启动的时候,悲剧发生 ...
- 关于javaagent拦截不到File类的问题
main类: Java code ? 1 2 3 4 public static void main(String[] args) { File file = new File(& ...
- Thinkphp框架下(同服务器下)不同二级域名之间session互通共享设置
在Thinkphp框架下根目录打开index.php 在头部加入如下代码即可: //入口文件 define('DOMAIN','abc.com');//abc.com换成自己的跟域名 //以下两行是为 ...
- 神奇的thrust::device_vector与nvcc编译选项
在C++的GPU库thrust中,有两种vector thrust::device_vector<int> D; //GPU使用的内存中的向量 thrust::host_vector< ...
- Windows Mysql binlog 数据恢复
show variables like 'log_bin%'; 可以看到Mysql binlog为关闭状态,那我们去更改为开启状态
- linux启动程序和关闭程序脚本
关闭脚本: #!/bin/bash source /etc/profile log() { echo `date +[%Y-%m-%d" "%H:%M:%S]` $1 } log ...
- iOS8新特性(2)——UIPopoverController和UIPresentationController
一.以往使用 UIPopoverController 都是只在iPad上使用 /** * UIPopoverController 只能用于iPad,上,iPhone上使用会崩溃 */ -(void)o ...
- Redis的启动过程
本文主要介绍Redis启动加载过程,总体上可以分为如下几步: 1. 初始化全局服务器配置 2. 加载配置文件(如果指定了配置文件,否则使用默认配置) 3. 初始化服务器 4. 加载数据库 5. 网络监 ...