ASP.net 页面生命周期
ASP.NET 页面生命周期
Page_Preinit(); 在页初始化开始时发生
Page_Init(); 在所有控件初始化且应用外观设置后引发
Page_InitComplete(); 在页初始化完成时发生
Load ViewState and Postback data; //加载视图和回传数据
Page_Preload(); 在load事件之前发生
Page_Load(); 服务器控件加载到page对象时发生
LoadCompleteLoadComplete(); 在所有回发数据和视图状态数据都加载到页以及页上的所有控件中后发生
Handle control events; //处理控件事件
Page_PreRender(); 在加载Control对象后,呈现之前发生
Page_Render(); Render 方法负责创建的文本和发送到客户端浏览器的标记。
Unload event; 当服务器控件从内存中卸载时发生,该事件先针对每个控件然后针对整页
Dispose method called;

asp.net页面生命周期
--------------------------------------------------------------------------------
页面执行是从FrameworkInitialize方法开始的,这个方法为页面构建控件树。该方法是TemplageControl类的受保护并且是虚方法。任何为aspx资源动态生成的句柄覆盖了该方法。在这个方法里,页面的所有控件树都被构建了。
接下来,ProcessRequest方法使页面经历了不同的几个阶段:初始化、加载视图状态信息、回传数据、加载页面代码和执行回传的服务器事件。在这之后,页面转换到了显示模式:收集被更新的视图状态;产生HTML代码,并且传送到控制台。最后,页面卸载,请求的全部服务结束了。
在各个不同阶段里,页面处理了与web控件相关、程序员代码能够干预并解决一定问题的事件。其间一些事件是专门为那些内嵌控件和不能在.aspx代码级别处理的控件而设计的。
一个页面要解决这样的事件,它能明确的注册成为合适的句柄。但是,为了和原有的Visual
Basic编程模式有后向兼容性,ASP.NET也支持了隐含事件的形式。在默认情况下,页面会寻找和事件相关的方法名;如果找到和事件相匹配的方法,这个方法就被认为是这种事件的处理程序。ASP.NET提供了六种专门的方法名,他们是
Page_Init , Page_Load , Page_DataBind , Page_PreRender 和 Page_Unload
。这些方法这些方法在Page类中已经被定义过,他们是相应事件的处理程序。HTTP运行时将自动的将这些方法绑定到相关的页面事件,而不需要程序员去编写把事件和方法联系起来的代码。举个例子来说,在下面的代码中,
Page_Load方法和页面的加载事件相关联:
this.Load + = new EventHandler(this.Page_Load);
这种自动识别是被 @Page 预指令的AutoEventWireup 属性控制的。如果这个属性被置false
,应用程序必须显式声明和事件相关的方法。不自动关联页面事件代码的页面执行起来会快一些,是因为他们不需要在匹配上做过多的工作。在Visual
Studio.NET 工程里可以把这个属性关闭掉。但是,默认设置是true,这意味着Page_Load方法被自动识别并被关联到相关的事件。
页面执行包含了下表中按顺序列出的几个阶段,他们被标志成为应用程序级别的事件,同时也可能是一些受保护、重定义的方法:
阶段 页面事件 可重定义的方法
页面初始化 Init
视图状态加载 LoadViewState
回传数据处理 控件里实现了IPostBackDataHandler接口的LoadPostData方法
页面加载 Load
回传数据变化检查 控件里实现了IPostBackDataHandler接口的RaisePostDataChangedEvent方法
回传事件处理 控件里定义的回传事件 控件里实现了IPostBackEventHandler接口的RaisePostBackEvent方法
页面预返回阶段 PreRender
页面返回阶段 Render
页面卸载阶段 Unload
上表中列出的阶段有的在页面级别是不可见的,他们只是在服务器控件的作者编写继承于Page的类时会使用到。Init , Load , PreRender , Unload,再加上定义在内嵌控件中的回传处理事件,他们构成了页面的整个生命周期。
各个阶段的执行
页面生命周期的第一阶段是初始化。这个阶段被Init事件所描述,这个事件在控件树被构建出来后执行。换句话说,当Init事件发生时,所有在.aspx文件中静态声明的控件被实例化并被赋予了默认值。在Init事件中可以初始化任何的在页面生命周期里需要的设置。例如:在这个阶段,控件可以加载外部的摸版文件或者是为事件建立处理句柄。需要注意的是,任何的视图状态信息在这个阶段里是不能用的。
紧接着初始化结束后,页面构架为页面加载视图状态。视图状态是 名称/值
对的集合,控件或页面在这里保存的数据在整个web请求过程中必须是稳固的。视图状态代表着页面的上下文。典型的,它保存着页面上次在服务器上被执行时控件的状态。视图状态在会话开始的第一个页面请求时是空的。在默认情况下,试图状态被保存在一个隐藏域里,这个隐藏域是被自动添加到页面里的。这个隐藏域的名称是
__VIEWSTATE。如果覆盖了LoadViewState方法——在Control类里被声明为受保护的方法——组件开发者可以控制视图状态的保存和它是如何和内部状态形成映射。
象LoadPageStateFormPersistenceMedium这样的方法和与其相对应的SavePageStateToPersistenceMedium方法可以用来加载或者保存视图状态到其他的存储中介里,例如:会话、数据库或者是服务器上的文件。和LoadViewState方法不相同的是,上面提到的方法只能在Page的继承类里使用。
一旦视图状态加载完毕了,页面里的控件被赋予了和上一次发送到浏览器时一样的状态。下一个阶段是将他们更新,使之与服务器端发生的变化相一致。在回传数据处理阶段,控件更新他们的状态,使之和客户端的HTML元素的状态相一致。例如,服务器控件TextBox有和它相对应的HTML控件<input
type=text>。在回传数据阶段,TextBox控件将得到<input>标签的值,并且用他来更新他的内部状态。每一个控件都可以从回传数据中取得自己数据的能力,并且把自己的状态更新。TextBox控件将更新它的Text属性,同样的,CheckBox控件也会将他们的Checked属性刷新。服务器控件和HTML元素的匹配是通过两者的ID来进行的。
在回传数据处理的最后阶段,所有的页面控件反映了上一个被更新的状态,这些都是由于客户端的输入变化所引起的。接下来,Load事件将被页面执行。
有一些控件,在两次请求中如果某些敏感属性发生了变化,他们需要对此作出响应,并且完成一定的任务。例如,如果客户端的textbox控件的文本发生变化,这个控件就激发了TextChanged事件。根据自客户端的数据,如果控件的一个或多个属性发生了变化,每一个控件都可以精确的激发合适的事件来处理。这些控件实现了IPostBackDataHandler接口,这个接口中的LoadPostData方法在Load事件之后就被执行了。通过重定义LoadPostData方法,控件可以验证两次请求中发生的变化并且激起相关的事件处理程序。
在一个页面周期中的关键事件是那些由客户端事件激发在服务器执行一段代码的事件。例如,当用户点击一个按钮,页面就需要回传。这个事件的处理是从按钮ID和值的收集开始的。如果控件是实现了IPostBackEventHandler接口(Button和LinkButton就是这样的情况),页面构架将调用RaisePostBackEvent方法。这个方法的具体情况是取决于控件的类型的。在上面提到的Button和LinkButton控件,这个方法就将寻找Click事件处理程序。
处理了回传事件之后,页面就准备被发送出去了。这个阶段是从PreRender事件开始的。这对于控件来说,那些需要在视图信息被保存与结果被发送之前这段时间里执行的动作,这是一个很好的时机。下一步就是SaveViewState
,所有的空间和页面本身就把视图状态的集合内容保存起来。接下来,视图状态被串行化、哈希编码、Base64
编码,并且保存在__VIEWSTATE隐藏域里。
各个控件的发送机制可以通过重定义Render方法来改变。这个方法构建了一个HTML
writer对象,用它来为控件产生HTML代码。对Page类里Render方法的默认执行包含了对所有成员控件的递归调用。页面为每一个控件调用一次Render方法,并缓冲HTML输出。
页面生命周期的最后阶段是卸载事件,这个事件在页面对象消失前被激发。在这个事件里,你应该把任何临界资源释放掉(例如:文件、图形对象、数据库连接)。
最后,浏览器接收到了HTTP响应,并且把页面显示出来。
博客园chunchill博主的文章详细讲解了每个阶段的工作:http://www.cnblogs.com/shineqiujuan/archive/2008/09/22/1295845.html
另附上MSDN官方文档: https://msdn.microsoft.com/zh-cn/library/ms178472.aspx
本文参考 CSDN知识库 http://lib.csdn.net/article/dotnet/53573
转载请标明链接
ASP.net 页面生命周期的更多相关文章
- asp.net页面生命周期
Asp.Net页面生命周期 本文转载自:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html 一.什么是Asp.Net页面生命周期 当 ...
- 【深入ASP.NET原理系列】--ASP.NET页面生命周期
前言 ASP.NET页面运行时候,页面将经历一个生命周期,在生命周期中将执行一系列的处理步骤.包括初始化.实例化控件.还原和维护状态.运行时间处理程序代码以及进行呈现.熟悉页面生命周期非常重要,这样我 ...
- ASP.NET编程模型之ASP.NET页面生命周期图解
ASP.NET编程模型中ASP.NET页面生命周期是指什么呢?它包括什么呢?ASP.NET编程模型之ASP.NET页面生命周期具体的过程有哪些呢?下面就开始我们的讲解吧: ASP.NET 页运行时,此 ...
- ASP.NET页面生命周期与控件生命周期
ASP.NET页面生命周期 (1)PreInit 预初始化(2)Init 初始化(3)InitComplete 初始化完成(4)PreLoad 预加载(5)Load 加载(6)LoadComplete ...
- Asp.Net页面生命周期--转发(学海无涯)
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
- ASP.NET页面生命周期和asp.net应用程序生命周期
作为一个asp.net程序员,不了解ASP.NET页面生命周期和asp.net应用程序生命周期是绝对不行的,那永远只能是菜鸟级别.我很早就学过,可是没次还是得去翻,一些事件还是记不住,还是记在自己的b ...
- (转)Asp.net页面生命周期详解任我行(1)-小试牛刀,编写页面代码
原文地址:http://www.cnblogs.com/xuyubing/archive/2013/10/01/3348344.html 前言 很久很久以前,还是我在学校的时候,我就看了传智里面视频, ...
- Asp.Net页面生命周期【转载,地址:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html】
一.什么是Asp.Net页面生命周期 当我们在浏览器地址栏中输入网址,回车查看页面时,这时会向服务器端(IIS)发送一个request请求,服务器就会判断发送过来的请求页面, 完全识别 HTTP 页 ...
- Asp.net页面生命周期详解任我行(3)-服务器处理请求详细过程
前言 百度了一下才知道,传智的邹老师桃李满天下呀,我也是邹老师的粉丝,最开始学习页面生命周期的时候也是看了邹老师的视频. 本人是参考了以下前辈的作品,本文中也参合了本人心得,绝非有意盗版,旨在传播,最 ...
随机推荐
- HTML5 语义元素(二)文本内容
上一篇介绍的是关于页面结构方面的语义元素,本篇介绍文本内容方面,包含:<bdi>.<details>.<summary>.<mark>.<outp ...
- $.type 怎么精确判断对象类型的 --(源码学习2)
目标: var a = [1,2,3]; console.log(typeof a); //->object console.log($.type(a)); //->ar ...
- 使用python抓取婚恋网用户数据并用决策树生成自己择偶观
最近在看<机器学习实战>的时候萌生了一个想法,自己去网上爬一些数据按照书上的方法处理一下,不仅可以加深自己对书本的理解,顺便还可以在github拉拉人气.刚好在看决策树这一章,书里面的理论 ...
- javascript单元测试框架mochajs详解
关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...
- Spring中Bean的实例化
Spring中Bean的实例化 在介绍Bean的三种实例化的方式之前,我们首先需要介绍一下什么是Bean,以及Bean的配置方式. 如果 ...
- MVC还是MVVM?或许VMVC更适合WinForm客户端
最近开始重构一个稍嫌古老的C/S项目,原先采用的技术栈是『WinForm』+『WCF』+『EF』.相对于现在铺天盖地的B/S架构来说,看上去似乎和Win95一样古老,很多新入行的,可能就没有见过经典的 ...
- 【干货分享】流程DEMO-固定资产转移流程
流程名: 固定资产转移 业务描述: 固定资产从某员工转移至另一员工,转出人与转入人必须不同 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: 流程: ...
- iOS从零开始学习直播之2.采集
直播的采集由采集的设备(摄像头.话筒)不同分为视频采集和音频采集,本篇文章会分别介绍. 1.采集步骤 1.创建捕捉会话(AVCaptureSession),iOS调用相机和话筒之前都需要创建捕 ...
- DevOps对于企业IT的价值
其实从敏捷延展开的 DevOps 概念很早就已经被提出,不过由于配套的技术成熟度水平层次不齐, DevOps 的价值一直没有有效地发挥出来.现如今,随着容器技术的发展, DevOps 在企业中的实践难 ...
- MySQL 优化之 MRR (Multi-Range Read:二级索引合并回表)
MySQL5.6中引入了MRR,专门来优化:二级索引的范围扫描并且需要回表的情况.它的原理是,将多个需要回表的二级索引根据主键进行排序,然后一起回表,将原来的回表时进行的随机IO,转变成顺序IO.文档 ...