ASP.NET页面揭秘之页面生命周期【转】

首先简单介绍下Page类

  在.NET Framework中,Page类提供了ASP.NET应用程序从.aspx文件开始创建的所有对象的基本行为。Page类在System.Web.UI命名空间中定义,它派生于TemplateControl类并实现了IHttpHandler接口。TemplateControl类是一个抽象类,它为 Page 类和 UserControl 类提供通用属性和方法。

  由于Page类派生于一个是实现了INamingContainer接口的类,Page类还充当它的所有组成控件的容器。一个控件命名容器实现了INamingContainer接口的第一个父控件。对于任何一个实现了命名容器接口的类,ASP.NET创建一个新的虚拟命名空间,其中保证所有的子控件在整个控件树有唯一的名称。通俗点INamingContainer接口无任何方法,知识保证其子控件有唯一的名称。

  Page类实现IHttpHandler接口的方法,从而可以充当一种特殊类型的HTTP请求(.aspx文件的请求)的处理程序。ASP.NET运行库调用ProcessRequest方法用来处理请求。

  在ASP.NET页面中,runat属性设置为server的任何控件都不能放在<form>标签外。那么是怎么做到确定所有控件不在form外的呢?可以用Page类的VerifyRederingInSeverForm()方法。控件在生成时调用该方法,以确保服务器窗体的主体包含它们。该方法不返回一个值,但是出错的情况下会抛出一个异常。

 

  在ASP.NET页面揭秘(一)中我们提到执行和触发ProcessRequest调用的步骤和事件过程统称为页面生存周期。其实HTTP运行库激活ProcessRequest时便开始执行页面,ProcessRequest启动页面并控制生命期

  页面生命期分三个阶段:建立阶段,回发阶段,结束阶段。每个阶段有一个或多个子阶段,并且有一个或多个事件和步骤引发组成。

一 页面的建立

  当HTTP运行库实例化页面类以便为当前提供服务时,页面构造器创建一个控件树。该控件树连接到页面解析器在查看ASPX源文件后所创建的实际类。处理请求开始时,应设置所有的子控件和页面本征特征(如HTTP上下文,请求对象和响应对象)。

  页面生命期第一步是确定为什么运行库正在处理页面请求。其中原因有多样:正常请求,回发,跨页回发或者回叫。页面对象根据具体原因配置内部状态,并根据请求方法(GET或POST)准备投递的值集合(post value)。这部完成后,页面就准备激发用户代码事件。

1.PreIntit事件

  它是页面生命周期进入点。该事件激发时,页面还没有关联任何的母版页和主题。页面滚动位置已经恢复,投递的数据可以用,并且所有的页面控件已经被实例化且默认地取ASPX源文件中定义的属性值(注意这时控件没有ID,除非在.aspx源文件中显式地设置它)只有这时才可以通过编程方式修改母版页或主题。该事件只有在页面上可用。IsCallBack(该值指示页请求是否是回调的结果),IsCrossPagePostback(获取一个值,该值指示跨页回发中是否涉及该页)和IsPostback(获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问)都在这时设置其值。

2.Init 事件

  这时已经设置母版页和主题,并且不能修改。页面处理器,即Page类上的ProcessRequest方法,遍历所有的子控件,使他们有机会以一种上下文相关的方法初始化它们的状态。所有的子控件递归地调用它们的OnInit方法。为控件集合中的每个控件设置命名容器和一个具体的ID。Init事件首先到达子控件,然后到达页面。这个阶段,页面和控件通常开始加载他们的部分状态。然而这时没有恢复视图状态。

3.IntiComplete事件

  这个只有页面才有的事件,表明初始化子阶段的结束。在Init 事件和IntiComplete事件之间只发生一个操作:打开视图状态变更的跟踪功能。它始终使控件能够真正地把所有以编程方式添加到ViewState结合中的数值持久地存储在存储介质中。即没有打开跟踪状态的控件,任何添加到ViewState的值将会在下一次回发时丢失。所有控件在发出Inti事件后立即打开视图状态跟踪,页面也不例外。

4.视图状态恢复

  如果页面由于回发处理,则恢复VIEWSTATE隐藏字段内容。_VIEWSTATE隐藏字段保存着一个请求结束时所有控件视图状态。页面的总体视图状态是一种调用上下文,包含页面最后一次服务器时每个组成控件的状态。(ViewState个可以留到控件相关的知识里介绍)

5.处理投递的数据

  HTTP请求中包装的所有用户数据,即用<form>标签定义的所有输入字段的内容,都在这时进行处理。投递的数据通常采取如下格式:

      TextBox1=text&DropDownList1=selectedItem&Button1=Submit

这是一串用&隔开的名称/值对。这些值装入一个内部使用的集合。页面处理器视图将投递的数据集合中的名称与页面中的控件的ID进行匹配。每找到一个匹配,处理器检查该服务器控件有没有实现 IPostBackDataHanlder接口。如果实现了,则调用该接口的LoadPostData方法,该控件有机会根据投递的数据刷新它的状态。具体说,如果LoadPostData()方法返回true,即状态已被更新,则把该控件添加到一个不同的集合中,以便以后引起关注。

(注:LoadPostData实现IPostBackDataHandler(实现控件数据回传必须要继承该接口)的一个方法,该方法参数NameValueCollection类型的对象装载了客户端提交的数据。另外该方法还会比较控件的旧值和新值返回一个bool类型值,以决定是否执行RaisePostDatachangedEvent方法,即跟新控件里的值,详细请看深入理解.net服务器控件)

  如果一个发送的名称与任何一个服务器控件都不匹配,则留下它并临时放在一个不同的集合中,稍后再试。

6.PreLoad事件

  它指页面已经结束系统初级初始化阶段,并且准备进入下一个阶段,即还有机会在该页面中的用户代码中配置页面的执行和呈现。

7.Load事件

  首先它针对页面的引发,然后递归针对所有的子控件引发。页面中的控件在此时创建,并且他们的状态完全反映前一个状态以及从客户端发送的任何数据。页面准备执行所有与页面逻辑和行为有关的初始化代码。这时,访问控件属性和视图状态是绝对安全的。

8处理动态创建的控件

  如果在显示前,页面中的所有控件都有机会完成初始化,页面处理器将再次尝试匹配那些尚未与现有控件匹配的投递值。这主要是应对动态的创建的控件

设想把一个控件动态地添加到页面树上,例如为了响应某个用户动作。每次回发以后重新创建页面,因此与动态创建的控件有关的任何信息会丢失。另一方面,提交页面的窗体时,其中的动态控件定期发送的合法而有效地信息填充。根据设计,第一次投递的数据时,不可能有什么服务器控件匹配动态控件ID。然而,ASP.NET Fromework知道Load事件会创建某些控件。因此有了再次匹配这一说。如果动态控件已经在Load事件中被重建了,现在就可以找到一种匹配,并且该控件可以用投递的数据刷新状态。

 

二 处理回发

  回发机制它涉及到把窗体数据投递到相同页面,然后使用视图状态恢复调用上下文,在服务器上最后一次生成投递页时存在的控件的同一种状态。

  在页面初始化已经完成并已经考虑投递的值以后,会发生某些服务器端事件。事件类型主要有两种。

1.检测控件状态变化

  整个ASP.NET工作机制围绕一个隐含的假设:在浏览器中操作一些HTML输入标签与服务器控件具有一一对应关系。例:<input type=”text”>与<asp:TextBox>。当用户把一些信息输入到元素中后,调用对应的TextBox 控件来处理该投递值。

  对于让LoadPostData方法返回true的所有控件,现在要执行RaisePostDataChangeEvent方法,该方法也属于IPostBackDataHandler接口。该方法通知ASP.NET应用程序控件的状态已经发生变化。

2.执行服务器端回发事件

  任何回发都从某个打算触发一个服务器端动作的客户端动作开始。相信大家对回发事件应经很理解了这里不再多介绍。通俗的说就是能触发服务器端的事件代码的执行。

3.LoadComplete事件

  表明页面准备阶段的结束。任何子控件都不会接受该事件。激发LoadComplete页面进入呈现阶段。

 

三 页面结束

处理回发事件以后,页面准备为浏览器生成输出。

1.PreRender事件

  通过处理该事件,页面和控件可以在呈现输出之前任何更新。PreRender事件首先为页面激发,然后递归地为控件激发。

2.PreRenderConmplete事件

  因为PreRender事件是递归地为所有子控件激发的,所以编程者无法知道何时完成预呈现阶段。而该事件的激发代表上面的事件结束了。

3.SaveStateComple事件

  在每个控件生成页面的标记之前,把页面的当前状态保存到视图状态存储介质。在页面上的控件状态已经全部保存到持久性质时,会触发该事件。

4.生成标记

  为浏览器生成标记是通过调用各组成控件来生成自己的标记来完成的,这些标记将存储到一个缓冲区中。这个阶段没有任何用户事件。

5.Unload事件

  生成阶段之后是一个递归调用,为每个控件引发Unload事件,并最终为页面引发Unload事件。Unload事件存在的目的是在释放页面对象之前执行所有最后的清除工作。典型操作是关闭文件和数据库连接。

转载于:https://www.cnblogs.com/ahjxxy/archive/2010/04/26/1721073.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【常见笔试面试算法题12续集一】动态规划算法案例1台阶问题练习题

加qq1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 以下问题&#xff0c;都可以用非动态规划的方法做&#xff0c;我为了整理动态规划的方法思路&#xff0c;就全部用动态规划的思路来解决问题&#xff0c;这样还可以简化问题的处理&#xff0c;是时间复杂…

linux 思维导图

工作中使用总结的linux 分享一下

ADO.NET 3.5 Cookbook:一、连接数据(1)保存连接字符串

问题 转载于:https://www.cnblogs.com/PocketZ/archive/2010/04/27/1722555.html

【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题

加qq1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 有一个矩阵map&#xff0c;它每个格子有一个权值。从左上角的格子开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;返回所有的…

mysql数据库思维导图

先前总结的一下数据库的思维导图&#xff0c;和大家分享一下&#xff0c;持续更新&#xff1b; 最近面试数据仓库工程师&#xff0c;过程中&#xff0c;问到索引类型&#xff0c;只是记得&#xff0c;普通索引&#xff0c;唯一索引&#xff0c;还有主键&#xff0c;面试中让说…

【常见笔试面试算法题12续集三】动态规划算法案例分析3 LIS练习题(最长上升子序列)

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 这是一个经典的LIS(即最长上升子序列)问题&#xff0c;请设计一个尽量优的解法求出序列的最长上升子序列的长度。 给定一个序列arr及它的长度n(长度小…

数据思维

最近听的一本书&#xff0c;《数据思维》&#xff1a;分享一下 1.【数据定义】 能被电子化的叫做数据&#xff0c;滴滴司机数据化&#xff0c;ofo数据化&#xff0c;堵车数据化&#xff0c;太形象了&#xff0c;数据以后会是电&#xff1b; 注意&#xff01;数据与自己业…

【常见笔试面试算法题12续集四】动态规划算法案例分析4 LCS练习题练习题(最长公共子序列的长度)

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 给定两个字符串A和B&#xff0c;返回两个字符串的最长公共子序列的长度。例如&#xff0c;A"1A2C3D4B56”&#xff0c;B"B1D23CA45B6A”&am…

MSMQ(MicroSoft Message Queue,微软消息队列)

MSMQ(MicroSoft Message Queue&#xff0c;微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式&#xff0c;相互通信的应用可以分布于同一台机器上&#xff0c;也可以分布于相连的网络空间中的任一位置。它的实现原理是&#xff1a;消息的发送者把自己想要发送…

hive 思维导图

1.整理了word文档&#xff0c;但是感觉没有思维导图清晰 &#xff0c;持续更新中 ​ hive 工作中分享。

【常见笔试面试算法题12续集五】动态规划算法案例分析5 01背包练习题

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 一个背包有一定的承重cap&#xff0c;有N件物品&#xff0c;每件都有自己的价值&#xff0c;记录在数组v中&#xff0c;也都有自己的重量&#xff0c;…

结构思考力思维导图

个人提升&#xff0c;喜欢钻研的同时&#xff0c;需要增加一下&#xff0c;其他方面的知识&#xff0c;分享一下&#xff1a;

我的JavaScript for Visual Studio插件开源了

最近忙于别的事情&#xff0c;我的JavaScript for Visual Studio插件一直没有做什么更新了很是对不起大家。不过觉得这个东西如果做好的话对大家还是有帮助的&#xff0c;所以我还是把代码share出来&#xff0c;这样大家可以一起来扩展&#xff0c;人多力量大嘛我希望大家一起来…

常用内存分配函数的说明

下面哪种C/C 分配内存的方法会将分配的空间初始化为0 A malloc() B calloc() C realloc() D new[ ] 1) malloc 函数&#xff1a; void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间&#xff0c;如果分配成功&#xff0c;则返回所分配…

前端学习(120):css精灵和好处

精灵图的目的&#xff1a;很多大型网站在首次加载的时候需要加载很多小图片&#xff0c;如果在同一时间&#xff0c;服务器又拥堵的话&#xff0c;就会导致页面加载慢。为了解决这一问题&#xff0c;就用了精灵图来解决加载时间过长影响用户体验的问题。 精灵图的本质&#xf…

Windows 2008上安装VS2008SP1时的怪异错误

由于重做系统&#xff0c;需要重新安装开发工具&#xff0c;于是开始了坚苦而漫长的安装。 不料在安装VS 2008 SP1时&#xff0c;安装到Microsoft .net framework 3.5 SP1时出错了&#xff0c;我就感觉纳闷了&#xff0c;这种安装过程我都安装了N次了还没出过什么错&#xff0c…

【常见笔试面试算法题12续集六】动态规划算法案例分析6 最优编辑练习题

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 对于两个字符串A和B&#xff0c;我们需要进行插入、删除和修改操作将A串变为B串&#xff0c;定义c0&#xff0c;c1&#xff0c;c2分别为三种操作的代价…

shell 思维导图

分享一下&#xff1b;

《大败局》读书笔记

史玉柱犯了一个很多青年企业家都容易犯的错误&#xff1a;把预期的利润当成了实际的收益&#xff0c;并以此为基数来设定自己的规划。 制度重于技术。 秩序重于利益。 职业人格缺陷。 市场是很公平的&#xff0c;你怎么从暴利中得来的钱&#xff0c;你得再怎么赔进去。 如果管理…