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 ...
随机推荐
- codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)
题目链接:http://www.codeforces.com/problemset/problem/281/A题意:将一个英文字母的首字母变成大写,然后输出.C++代码: #include <c ...
- codeforces水题100道 第十题 Codeforces Round #277 (Div. 2) A. Calculating Function (math)
题目链接:www.codeforces.com/problemset/problem/486/A题意:求表达式f(n)的值.(f(n)的表述见题目)C++代码: #include <iostre ...
- 【ipad神坑】ipad麦克风听不到声音怎么回事 微信QQ语音视频对方都听不到
今天遇到了这个问题 说话听不见,但是敲击ipad,可以明显的听到击打的声音 siri也是可以听到 上网上找,大多都是说恢复设置,重启,隐私麦克风权限等解决方案 都是浪费感情 全部尝试过了,依然没有用. ...
- 【cs229-Lecture2】Linear Regression with One Variable (Week 1)(含测试数据和源码)
从Ⅱ到Ⅳ都在讲的是线性回归,其中第Ⅱ章讲得是简单线性回归(simple linear regression, SLR)(单变量),第Ⅲ章讲的是线代基础,第Ⅳ章讲的是多元回归(大于一个自变量). 本文的 ...
- springbatch---->springbatch的使用(四)
这里我们重点学习一下springbatch里面的各种监听器的使用,以及job参数的传递.追求得到之日即其终止之时,寻觅的过程亦即失去的过程. springbatch的监听器 一.JOB LISTENE ...
- CSS3 -- 动画库
http://www.jq22.com/yanshi819 文件结构: html <!DOCTYPE html> <html lang="zh-CN"> & ...
- Nginx之让用户通过用户名密码认证访问web站点
有时我们会有这么一种需求,就是你的网站并不想提供一个公共的访问或者某些页面不希望公开,我们希望的是某些特定的客户端可以访问. 那么我们可以在访问时要求进行身份认证,就如给你自己的家门加一把锁,以拒绝那 ...
- kafka 的quick start(windows平台)
h1, h2, h3, h4, h5, h6, p, blockquote { margin: 5px; padding: 5; } body { font-family: "Helveti ...
- python3查询数据库并生成excel报表
#!/usr/bin/env python3 #encoding=UTF- import os import time import xlwt hostIp = 'xxx.xxx.xxx.xx' us ...
- Spark2 Dataset之视图与SQL
// 创建视图 data.createOrReplaceTempView("Affairs") val df1 = spark.sql("SELECT * FROM Af ...