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 - 截屏,view截图的基本方法
推荐一个第三方好用的框架:SDScreenshotCapture #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice cur ...
- 【.netcore基础】MVC制器Controller依赖注入
废话少说,直接上代码 首先我们得有一个接口类和一个实现类,方便后面注入MVC里 接口类 public interface IWeatherProvider { List<WeatherForec ...
- WP8.1学习系列(第十七章)——Windows Phone重要图形、视觉指示器和通知
美感在手机应用中是不可或缺的,它是直观操作的代名词.在 Windows Phone 中,你的磁贴.初始屏幕.图标.控件和导航的视觉元素会引起用户对应用程序内的相关任务.优先事项或操作的注意,并采用新颖 ...
- laravel部署常用命令
php composer install composer dump-autoload php artisan key:generate .env 及 config/database.php里的数据库 ...
- sencha touch 在线实战培训 第一期 第六节
2014.1.11晚上8点开的课 本来计划8号晚上开课的,不过那天晚上小区电路出了问题,所以没有讲成.后面两天我又有点其他的事情,所以放到了11号来讲. 本期培训一共八节,前三堂免费,后面的课程需要付 ...
- wireshark和RawCap跟踪并解决中文乱码问题
一.问题概述 说下程序的架构. 有个后台管理系统A,在页面修改数据后,会用httpClient发http请求给系统B: 系统B做了异步机制,收到A发的请求后,将数据封装为Mq消息发给RabbitMq, ...
- 安装sqlite3.8的方法
wget http://www.sqlite.org/2015/sqlite-autoconf-3081101.tar.gz tar -xvzf sqlite-autoconf-3081101.tar ...
- mock server搭建及接口测试简单实例
一.搭建mock server mock工具很多,这里我们选择用简单易操作的moco服务器 使用前必须先安装java,去相关网站下载Standalone Moco Runner 二.使用mock se ...
- Android LayoutCast 初探
今天无意间看见了一个神器,顿时让我血气蓬勃! 废话不多说,先上网址:https://github.com/mmin18/LayoutCast 把代码和资源文件的改动直接同步到手机上,应用不需要重启.省 ...
- Unity3D笔记 愤怒的小鸟<一>场景切换
新建3个场景,场景1 Start 十秒后自动切换到场景2 Splash,场景2在二秒后自动切换到场景3 Selection 一.场景一Start 二.场景2 Splash 三.场景3 Selectio ...