当一个页面请求被发送到WEB服务器,不论该事件是由页面提交还是由页面重定向而激发的,页面在其被创建到释放的过程中都会运行一系列的事件。当我们创建ASP.NET页的时候往往没有关注它的执行周期,从而让我们碰到很多让自己头疼的问题。但是,如果被正确的使用和操纵,页生命周期会成为一个高效且强大的工具。很多开发者都认识到,理解页面执行过程中发生了什么和什么时候发生对高效编写ASP.NET页和用户控件是十分关键的。那么,让我们来详细的了解一个ASP.NET页面从被创建到其被释放的过程中的十个事件。我将把这个过程建立在一个用C#编写的ASP.NET简单提交页上。这个页面首次会加载一些服务器端WEB控件,当WEB服务器接收到它的请求时,WEB服务器就会处理我们的WEB控件并最终让我们得到该页的HTML呈现。处理页面的第一步是对象初始化。

1.对象初始化
页面中的控件(包括页面本身)都是在它们最初的FORM中被首次初始化的。通过在ASPX页面的后台代码文件的构造器中声明你的对象,页面将知道对象的类型,并知道需要创建多少个这样的对象。一旦你在构造器中声明了你的控件,你就可以在它的任何子类,方法,事件或者属性中访问到它们。但是,如果你的任何对象是在ASPX文件中指定的控件,这样的控件是没有属性的。而且这样做对从代码中访问它们是危险的,因为无法保证这些控件实例是按照怎样的顺序被创建的(假定它们都是能完全被创建的)。初始化事件可以通过OnInit方法重载。

2.加载视图状态数据
初始化以后,控件仅能通过ID引用(还没有建立用于相对引用的文档对象模型)。在LoadViewState事件中,已初始化的控件获得第一个属性:上一次提交存留到服务器的视图状态信息。页视图状态通过ASP.NET维护,它被用于在一个往返行程中存留信息到服务器。视图状态信息被保存为一个名称/值对,它包含控件的如Text和Value一类的信息。视图信息被保存在隐藏<input>控件的值属性中在页请求中传递。正如你所了解的,这是旧的ASP3.0状态维护技术的一个巨大飞跃。这个事件可以通过LoadViewState方法重载,往往用来在控件被填充时定制它所接受的数据。

3.LoadPostData处理回传数据
在创建页的阶段,被发送到服务器端的Form数据(ASP.NET中的术语为回传数据)依照每个控件的数据需求进行处理。当页面提交Form时,框架将在每个提交数据的控件上实现IPostBackDataHandler接口。页面然后激发LoadPostData事件,通过页面解析发现实现了IPostBackDataHandler 接口的控件,并用正确的回传数据更新控件状态。ASP.NET通过匹配控件的唯一标示符来更新正确的控件,该标示符具有名称值集合中的名称值对。这也就是在所有特定的页中每个控件都需要一个唯一标示符的原因之一。其它的步骤都由框架来完成,以确定每个标示符在环境中是唯一的,例如存在于单页面中的自定义用户控件。LoadPostData事件被激发后,RaisePostDataChanged事件就可以随时被执行了。
4.对象加载
对象在Load事件中获得正确的Form。所有的对象首先都被组织在页DOM(ASP.NET中称为控件树)中,并且很容易通过代码或者相对位置(crawling the DOM)来引用。然后对象就可以自由的访问HTML中的客户端属性集,例如width,value,或者visibility。加载时,控件逻辑,如算法、以编程方式设置控件属性、用StringBuilder装配输出字符串都同时被执行。大部分的工作都是在这一阶段完成的。Load 事件能够通过调用OnLoad来重载。
5.激发RaisePostDataChanged事件
如前所述,这发生在所有实现了IPostBackDataHandler接口的控件被正确的回传数据更新以后。在这个过程中,每个控件都有一个布尔值的标识,标识其自上一次提交后该控件的数据是被更改还是保持原值。然后ASP.NET通过搜索页来寻找任何显示控件数据被更改的标识并激发
RaisePostDataChanged。RaisePostDataChanged事件直到Load事件发生后,所有控件被更新后才激发。这保证了在控件被回传数据更新前,其它控件的数据在RaisePostDataChanged事件中没有被手动更改过。
6.处理客户端回传事件
当回传更新导致数据改变而引发服务器端事件后,引发回传的对象会在RaisePostBackEvent事件中被处理。这种激发回传的对象往往是其状态改变而引发回传的控件(其autopostback被启用)或者是一个被点击的窗体提交按钮。很多代码都在这个事件中执行,因为这是控制事件驱动逻辑的理想位置。为了保证呈现到浏览器的数据的正确性,在一系列的回传事件后RaisePostBackEvent事件最终被激发。基于一致性的考虑,回传中改变的控件直到这个函数被执行后才被更新。也就是说,被预期事件改变的数据总是在结果页反映出来。RaisePostBackEvent事件可以通过RaisePostBackEvent来捕捉。
7.对象预呈现
对象被预呈现的地方对于那些能够保存到视图或者维持其视图状态的对象来说是最后一次有机会改变的地方。这使得预呈现步骤成为做最后修改的理想位置,例如改变控件属性或改变控件树结构,不用担心因为数据库请求或者视图状态更新而导致对象的变化。预呈现阶段之后,对象改变被锁定并且不能再被保存到页视图状态中。预呈现阶段可以通过重载OnPreRender实现。
8.保存视图状态
只有在所有的页面对象的改变都发生后视图状态才被保存。对象状态数据被保存在隐藏<input>对象中,这也是对象状态数据准备呈现到HTML的地方。在SaveViewState事件中,值能够被保存到视图状态对象中,但页面控件的改变并不能保存到其中。可以通过重载SaveViewState实现这个步骤。
9.呈现HTML
Render事件通过装配用于浏览器输出的HTML来着手页的创建。在Render事件中,页调用对象使它们呈现为HTML,然后页收集HTML来发送。当Render事件被重载的时候,开发者可以为浏览器创建定制的HTML,此时页面创建的任何HTML都还没有生效。Render 方法用HtmlTextWriter对象作参数并由它产生HTML给浏览器。这里仍然可以作修改,但是这样的修改只会反映到客户(译者注:意即改变只会在HTML呈现中反映而视图状态并无法被改变)。Render 事件可以被重载
10.释放
当页面的HTML呈现后,对象被释放。在Dispose事件中,你可以清除任何在页面创建中构造的对象或者引用。在这里,所有的处理都已经被执行,你可以安全的释放任何还存在的对象,包括Page对象。

Dispose能被重载具体对应的事件顺序如下:
Page_Init()
LoadViewState
LoadPostData
Page_Load()
RaisePostDataChanged
RaisePostBackEvent
Page_PreRender()
SaveViewState
Page_Render()
UnLoad

转载于:https://www.cnblogs.com/SissyNong/archive/2009/06/29/1513375.html

ASP.NET页面的生命周期(转载)相关推荐

  1. 【转】Asp.net页面的生命周期

    介绍 Asp.net是微软.Net战略的一个组成部分.它相对以前的Asp有了很大的发展,引入了许多的新机制.本文就Asp.net页面的生命周期向大家做一个初步的介绍,以期能起到指导大家更好.更灵活地操 ...

  2. ASP.NET页面的生命周期

    当一个获取网页的请求(可能是通过用户提交完成的,也可能是通过超链接完成的)被发送到Web服务器后,这个页面就会接着运行从创建到处理完成的一系列事件. ASP.NET页面初始的过程: 1.Page_In ...

  3. asp.net 页面全生命周期

    .Net 托管代码和非托管代码的区别 后台代码隐藏/显示前台控件 .Net 页面生命周期 2012-03-21 13:31:08|  分类: .NET |  标签:.net  页面生命周期  c#  ...

  4. 基础——ASP.NET页面的生命周期

    页请求:页请求发生在页生命周期开始之前.当用户请求一个页面,ASP.NET将确定是否需要分析或者编译该页面,或者是否可以在不运行页的情况下直接请求缓存响应客户端. 开始:发生请求后,页面就进入了初始化 ...

  5. Asp.net页面的生命周期之通俗理解

    很早就看了cat chen的深入理解 ASP.NET 动态控件 (Part 3 - 页面生命周期) ,当时是理解了,但是很不好理解.尤其是追赶加载那部分.最近重新看到那篇文章,禁不住想用打比方的方式来 ...

  6. Asp.net2.0页面的生命周期(续)

    以上就是Asp.net页面生命周期中的几个主要事件.每次我们请求一个Asp.net页面时,我们都经历着同样的过程:从初始化对象到销毁对象.通过了解Asp.net页面的内部运行机制,我相信大家在编写.调 ...

  7. 【Step by Step】编写代码验证一个ASP.NET应用程序和页面的生命周期

    我们知道ASP.NET Page的生命周期实际上是ASP.NET Application的生命周期的一部分.这个周期经历了HTTP Module => HTTP Handler => AS ...

  8. Asp.net2.0页面的生命周期

    当一个获取网页的请求(可能是通过用户提 交完成的,也可能是通过超链接完成的)被发送到Web服务器后,这个页面就会接着运行从创建到处理完成的一系列事件.在我们试图建立Asp.net页面的 时候,这个执行 ...

  9. .Net页面的生命周期(ZZ)

    1.        初始化:主要是执行Page的Init事件和OnIint方法. 2.        加载视图状态:主要是执行LoadViewState方法,就是从ViewState中获取上一次的状态 ...

  10. 深入了解asp.net框架。生命周期以及事件处理机制

    刚接触asp.net框架觉得很好奇.他的快速开发是怎么实现的.控件的状态又是怎么保持的.我们都知道http是无状态的.而且网上很多人都说使用asp.net框架使用服务器框架是非常慢的. 带着这些疑问我 ...

最新文章

  1. 蓝云公布2019云生态战略,如何解决企业上云关键问题?
  2. Resource temporarily unavailable 错误
  3. 使用 EasyBCD 安装Ubuntu 14.04 Error 15: file not found错误的解决方法
  4. 【工具】更新云文档办公利器汇总,腾讯新增批量上传多文件上传,云文档对比测试报告...
  5. LeetCode之字符串(C++)的切割简单实现
  6. Java技巧:创建监视友好的ExecutorService
  7. 中文名称:程序员杂志2007精华本及附赠DVD光盘
  8. 微信小程序python_用python一步一步教你玩微信小程序【跳一跳】
  9. linux查看内存_【001】一文带你全面掌握Linux系统体系结构
  10. java 正则表达式案例
  11. TCP新手误区–数据校验的意义
  12. powershell 遍历json_遍历JSON文件PowerShell
  13. 做phodal的御用编辑,其实我是拒绝的
  14. 微信小程序-猜拳小游戏
  15. D. Sonya and Matrix
  16. 深入浅出多目标优化--10分钟多目标优化入门
  17. Problem B. 涮羊肉
  18. Brendan Eich谈Javascript的起源
  19. g700刷机包android5,华为G700线刷刷机教程_华为G700线刷rom包_救砖系统刷机包
  20. vivo手机html卸载不了,vivo手机怎么彻底卸载删除软件残留的垃圾文件呢

热门文章

  1. python random模块安装_Python中的For循环和Random模块
  2. Linux分区的那些方案
  3. 如何在点击事件中取得复选框选中的单元格值
  4. Linux笔记 -- Pyhton虚拟环境Linux系统基本操作Vim编辑器基本操作
  5. 收音机磁棒天线4根接法_五六十年代不需要电的收音机,你见过吗?
  6. 前端笔记—第4篇CSS基础知识2
  7. kafka单机环境搭建
  8. angularjs 资源集合
  9. csu 1196 - 去爬山
  10. Word(六)-强大的“邮件合并”(2)