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 ...
 
随机推荐
- 普通for循环和增强for循环的区别
			
1.普通for循环:自行维护循环次数,循环体自行维护获取元素的方法: int[] array = new int[]{1,2,3,4,5}; //int[] array ={1,2,3,4,5} ; ...
 - iOS 事件的产生、传递、响应
			
一.事件的产生和传递 1.1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中为什么是队列而不是栈?因为队列的特定是先进先出,先产生的事件先处理才符合常 ...
 - 【css系列】创建网页加载进度条
			
一.最简单或者明显的方式是使用定时器 1.在网页中加入布局覆盖真实网页内容 2.使用定时器确定加载所用时间的长短,其实并不是真正的加载进度实现 <!DOCTYPE html> <ht ...
 - Storm架构和编程模型总结
			
1. 编程模型 DataSource:外部数据源 Spout:接受外部数据源的组件,将外部数据源转化成Storm内部的数据,以Tuple为基本的传输单元下发给Bolt Bolt:接受Spout发送的数 ...
 - input type="number"时,maxlength不起作用怎么解决
			
最近小颖在做公司的angular项目时,发现当input type="number"时,maxlength不起作用,百度了下解决方式,顺便记录下,以便后期查看嘻嘻 <inpu ...
 - [转]Linux sendmail 详解
			
Internet上最基本的服务,现在应该大部分人都有自己的邮箱吧,用的人多,但理解的人估计没多少,我自己以前也是常常用,但对其原理并不操心.今天就来操心下,进行个小总结 一.邮件服务的基本流程 ...
 - 【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十八:SDRAM模块① — 单字读写
			
实验十八:SDRAM模块① — 单字读写 笔者与SDRAM有段不短的孽缘,它作为冤魂日夜不断纠缠笔者.笔者尝试过许多方法将其退散,不过屡试屡败的笔者,最终心情像橘子一样橙.<整合篇>之际, ...
 - 问题记录 为ubuntu16.04添加windows字体(解决JIRA图表乱码的问题)
			
最近遇到了JIRA在新的ubuntu机器上图表的中文无法正确显示的问题,解决的方法是,为ubuntu安装中文字体,我们选择把windows上的字体复制到ubuntu上来安装的方法,步骤如下: 从win ...
 - 严版数据结构题集2.13 & 2.14
			
1.试写一算法在带头结点的单链表结构上实现线性表操作Locate(L,x) 2.试写一算法在带头结点的单链表结构上实现线性表操作Length(L) #include<stdio.h> #i ...
 - 关于linux例行任务crontab的使用
			
Linux 例行性任务(也叫周期性任务)命令使用:crontab1.crontab -l 查看当前用户的任务2.crontab -e 编辑(设置)当前用户的任务,执行行不用重启crond服务.3 ...