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 ...
随机推荐
- ssiOS应用架构谈 本地持久化方案及动态部署
本文转载至 http://casatwy.com/iosying-yong-jia-gou-tan-ben-di-chi-jiu-hua-fang-an-ji-dong-tai-bu-shu.html ...
- maven默认本地仓库目录
C:\Users\${姓名}\.m2\repository\
- 【Java并发编程二】同步容器和并发容器
一.同步容器 在Java中,同步容器包括两个部分,一个是vector和HashTable,查看vector.HashTable的实现代码,可以看到这些容器实现线程安全的方式就是将它们的状态封装起来,并 ...
- 《转载》Linux服务之搭建FTP服务器&&分布式文件服务器的比较
参考帖子: Linux服务之FTP vsftpd的使用 大型网站图片服务器架构的演进 rsync同步文件的艺术 rsync命令详解 深入理解Tomcat虚拟目录 (测试已经OK)
- DLL注入之Appinit_Dlls
AppInit_DLLs is a mechanism that allows an arbitrary list of DLLs to be loaded into each user mode p ...
- 推荐系统之隐语义模型(LFM)
LFM(latent factor model)隐语义模型,这也是在推荐系统中应用相当普遍的一种模型.那这种模型跟ItemCF或UserCF的不同在于: 对于UserCF,我们可以先计算和目标用户兴趣 ...
- SharpGL学习笔记(七) OpenGL的变换总结
笔者接触OpenGL最大的困难是: 经常调试一份代码时, 屏幕漆黑一片, 也不知道结果对不对,不知道如何是好! 这其实就是关于OpenGL"变换"的基础概念没有掌握好, 以至于对& ...
- jenkins Email-ext plugin插件中Pre-send Script设置说明
在使用jenkins Email-ext plugin发送邮件时,项目中使用了SVN去同步,发现每次有同步,都会发送邮件,现只想SVN只更新,不发送邮件通知,这就要在Pre-send中做修改 看看官网 ...
- Android Google Maps API 网络服务用于网络定位、计算路线、获取经纬度、获取详细地址等
extends:http://blog.csdn.net/h7870181/article/details/12505883 Google Maps API 网络服务 官网地址 : https://d ...
- 遮挡剔除 Occlusion Culling(转)
一.首先介绍下draw call(这个东西越少你的游戏跑的越快): 在游戏中每一个被展示的独立的部分都被放在了一个特别的包中,我们称之为“描绘指令”(draw call),然后这个包传递到3D部分在屏 ...