ASP.NET 的 页面的生存周期

所谓的页面生存周期,指的是一个 ASP.NET 页面对象从初始化到销毁经过的步骤。在通常情况下,一旦某个请求对应到一个ASP.NET 页面时,一个直接或间接继承自Sysytem.Web.UI.Page类型的对象开始初始化,并且开始执行页面生存周期中的所有步骤。而该类型的对象,就是客户端请求的ASP.NET 页面的后台托管代码。

 

ASP.NET页面生存周期各步骤的功能大致分类:

1. 初始化

2. 加载数据和页面

3. 触发时间

4. 保存状态并呈现页面

1. 初始化 - PreInit 、 Init 、InitComplete 三个步骤

2. 加载数据和页面 LoadState ProcessPostData PreLoad Load ProcessPostData(第二次)等步骤

首先从页面回传的数据加载ViewState对象, 所有的数据都会以Base64 编码随页面传入服务器。然后开始处理回传的数据,也就是把表单中的键/值对存入对象之中。随后就开始加载页面,程序员通常会在这里做一些初始化的编程。最后会再次执行ProcessPostData ,以处理Load时候新添加的数据。

第一次ProcessPostData 处理保证了执行页面加载之前,所有数据从页面上读入,这样页面加载时就可以访问这些数据。而第二次执行ProcessPostData ,以处理Load时候新添加的数据。

3. 触发事件

触发事件包含了ChangedEvent 和 PostBackEvent 步骤。这里首先会比较ViewState中的数据和页面上一次回传的数据,觉得哪些时间需要被触发,这里的时间是逐一被触发的,但顺序将无法确定。然后会查看是否触发Post Back事件,该时间也就是页面提交的事件。

4. 保存状态并呈现页面

这里会包含SaveState SaveStateComplete、Render步骤。首先页面会编码保存所有的ViewState , 然后将其潜入到页面的一个隐藏空间中。接着转换所有的控件标签并生成页面HTML,并发回客户端。

 

 

在页面加载的事件中,也是按照一定的顺序进行加载,并且分别执行不同的功能

      1、对象初始化Init事件:页面初始化的标记是Init事件。页面中的控件(包含页面自身)都是在它们最初的Form中被初次始初化的。在胜利创修页面的控件树后,对利用程序激发这个事件。当Init事件产生时,在.aspx流白件中动态声亮的所有控件都以真例化并与其默许值。应当注意到,这是还出有视图状态疑作可求使用。固然可以重载OnInit法子,但是体系并没有保证这些控件真例是依照怎样的次序被创立的。
  2、加载视图:正在始初化之后,页里框架立刻加载当页面的视图状况(ViewState)。所谓视图状态便是一些称号/值对的聚集,例如能够保留TextBox控件的ID和Text属性值。它普通被用于在一个来回路程中存留疑作到效劳器,便介入HTTP恳求取呼应。页面视图状态被存储在<inputtype=”hidden”>字段中,做为_VIEWSTAE的值入止记载。该视图状态通过ASP.NET主动保护。通功沉写LoadViewState方式组件,启收职员可节制如何复原视图状态以及如何将其内容暗射到内部状态。LoadViewState办法就是自ViewState中获与上一次的形态,并依照页面的控件树的构造,用递回来遍历整个树,将对于当的状态复原到每一个控件上。
  3、处理回发数据:复原了视图状态,页面树类的各个控件的状态就取阅读器上次呈现该页面时这些控件所处的状态雷同。下一步需求更新这些控件的状态以发送给客户端。回发数据处理阶段是各个控件有机遇更新其状态,以即正确的反应相当的HTML元荤在客户真个状态。例如,一个服务器TextBox控件对当的HTML元荤是<inputtype=text>,在回发数据阶段,TextBox控件将检索<input>标志的以后值并用它刷新其内部状态。每个控件负责从以发送的数据中提与相应值,并更新其某些属性。TextBox控件将更新Text属性,而CheckBox控件将刷新其Checked属性。服务器控件和HTML元荤之间的婚配闭系由两者的ID肯定。页框架将在每个降接数据的控件上真现IpostBackDataHandler交心,然后激发LoadPostData事件,通过页面解析发明完成了IpostBackDataHandle交心的控件,这样就能准确的回传数据更新控件状态。在辨认控件时,ASP.NET通过婚配控件的独一标示符来更新正确的控件,该标识符具著名称值集和中的称号值对。这也就是在所有特定的页中每个控件都须要一个独一标识符的缘由之一。其他的步骤都由框架来完成,例如肯定每个标识符在环境中能否独一以及控件的基础属性等。LostPostData方法的本型如下:PublicvirtualboolLoadPostData(stringpostDatakey,NameValueCollectionpostCollection)
PostDataKey是本识控件的要害字,能够懂得为控件的ID,postCollection是包括归发数据的聚集,可以懂得为视图状况值。当方式前往一个bool值,新网科技,假如是true,则表现控件形态因回发而更改;否则前往false。页框架会更和踪一切往回true的控件并在那些控件上调用RaisePostDataChangeEvent事情。LoadPostData办法是由System..Web.WebControls.Control订义的,而加加的每一个效劳器控件也是自System.Web.WebControls.Control承继的,所以关于数据的回发处置并没有须要干涉。
  4、加载页面Load:在回发数据处理阶段停止时,页面中的所有控件都依据客户端上所输进的更改来更新的状态。此时,对页面激起OnLoad事件。关于这个事件,置信大少数冤家都会比拟熟习,用VisualStudio.Net天生的页面中的Page_Load方法就是呼应Load事件的法子,关于每一次要求,Load事件都会触发,Page_Load方法也就会施行。可以应用该法子执行一些页面始初化,例如筹备佳数据库的衔接字符串。在事件援用中,为了进步机能,通常使用Page类的IsPostBack属性断定是没有是数据回发。
  5、回发更改通知RaisePostDataChanged:如3所述,在一切完成了IpostBackDataHandler交心的控件被准确的归传数据更新后,每个控件皆有一个布我值的标识,标识其自上一次降接后改控件的数据是被更改仍是坚持其值。然后ASP.NET通功搜寻页来寻觅任何显示控件数据被更改的本识并激起RaisePostDataChanged。RaisePostDataChanged事件直到Load事情产生后,一切控件被更新后才激收。那保证了在控件被归传数据更新前,其他控件的数据正在RaisePostDataChanged事件中出有被手动更改功。固然也能够在Page的基本上本人订义数据更改的事件,但通常这个事件由太大用途。
  6、处理回发事件RaisePostBackEvent:当回传更新招致数据转变而引发服务器端事件后,引发还传的对象会在RaisePostBackEvent事件中被处理。这类引发还传的对象去去是一个按钮被双打或许其状态转变而引发还传的控件。例如Button触发乐Onclick事件、客户端改动了某个文原框的文原、同时将AutoPostBack设放为true、触发TextChanged事件等。良多代码都在这个事件中执行,由于这是节制事件驱动逻辑的幻想地位。为了保证出现到阅读器的数据的准确性,在一系列的回传事件后,RaisePostBackEvent事件最末被激发。基于分歧性斟酌,会传中转变的控件直到这个函数被执行后才被更新。在实践的ASP.NET开发农作中要做的就是在此事件发作前处理代码。
  7、预呈现PreRender:在处理回发事件后,页面就筹备进行呈现。这一阶段的标记是PreRender事件。各个控件可应用这个很佳的时机,以即执行任何须要在保管视图状态和呈现输出成果的前一刻完成得最后一些更新操做。终极要求的处置都会改变为施展服务器的呼应,预呈现这个阶段就是施行在最末呈现之前所做的状态的更改,由于在呈隐一个控件之前,必需更具它的属性来发生HTML,好比Style属性。这是典范的例子,这预出现之前,可以更改一个控件的Style,该执行预呈隐时,就可以把Style保留下来,做为呈现阶段显示HTML的样式疑作。
  8、保留状况SaveViewState:下一个状态为SaveViewState,在这一状态中所有控件以及页面自身可以刷新本人的SaveState聚集的内容。所失掉的视图形态随后得以序列化、进行哈希运算、入止Base64编码并联系关系到VI-EMSTATE暗藏自端。
  9、出现视图Render:到那里,实践上页里对恳求的处置基础便告一段降了,正在Render事件中,也调用对于象是它们呈隐为HTML,然后也搜集HTML发送给客户。客户接受到HTML标志后入止沉组,终极显示给客户。该Render事情被重载时,启发者可认为涉猎器创修定值的HTML,彼时页面创立的任何HTML皆还出有失效。Render方式用HtmlTextWriter对象做参数并由它发生HTML送给阅读器。这重要用于自订义控件的启收。
  10、处理Disposed:施行烧毁控件前的所有终极清算操做。在彼阶段必需开释对昂贱资流的援用,如内存的退出、数据库的衔接等。
  11、卸载Unload:一个页里的最后生存标记便是Unload事件,当事件在页面对于象被解除之前产生。在彼事件中,可以调用Dispose办法绝能够开释占用的任何要害资流(例如,白件、图形对象以及数据库衔接)。

事件加载顺序

posted @ 2012-05-19 20:35  Sky.Grain  阅读(249)  评论(0编辑  收藏  举报