NET 页面生命周期

来源:互联网 发布:linux oracle 编辑:程序博客网 时间:2024/06/18 07:16
  

对于

ASP.NET

开发者,理解

ASP.NET

的页面生命周期是非常重要的。主要是为了搞明白在哪里放置特

定的方法和在何时设置各种页面属性。但是记忆和理解页面生命周期里提供的事件处理方法

(method)

常困难。互联网上有很多关于页面生命周期内部机制的文章,所以本文只准备简单覆盖技术的基础部分,

更主要的目的是给大家提供一个简单得记忆页面生命周期的方法。

 

准确的记忆

ASP.NET

页面生命周期每一个阶段发生了什么事情是比较困难的,一种便于记忆的方法是根

据各个阶段的名字组合出一个缩写。微软的文档给出的

ASP.NET

生命周期如下:

 

Page 

Request 

Start 

Page 

Initialization 

Load 

Validation 

Postback 

event 

handling 

Rendering 

Unload 

根据这个组合出一个缩写非常容易。

既然

Page 

Request

技术上并不是页面生命周期的一部分

(这个阶段

仅仅标示我们是否开始一个页面周期或者从缓存加载一个页面),我们为了方便,就不包括这一阶段。

 

 

Start 

 

Initialize 

 

Load 

 

Validate 

 

Event 

Handling 

 

Render 

这样就组合出一个缩写

“SILVER'

,这个英文单词非常好记。当然,一定要记住页面生命周期的最后一个环

unload

没有包括在里面。如果你觉得有必要,你可以记忆为

“SILVER

-

U”

或者

“SILVER

-YOU"

,尽管

有点破坏这个记忆法的完美性。现在,我们非常容易就记住了页面生命周期,接着我们总结一下每一步都

发生了什么,都有什么事件伴随着发生。

 

1. 

Start 

在这个阶段,页面属性,比如

Request, 

Response, 

IsPostBack

UICulture 

被创建。最为一个开发

人员,大部分时候在这个阶段你不需要做任何事。如果你需要调用或者重写

(override)

这一阶段的行为,

可以使用

PreInit

方法创建或者重新创建动态控件,设置

master 

page

或者

theme

或者读取和设置

pr

ofile 

property

的值。要注意的一点是,如果是回传

(postback)

的页面请求,所有控件的值还没有从

vie

w state

里还原,如果你在这个阶段设置一个控件的值,这个值有可能在下面的阶段被重写并覆盖

 

2. 

Initialize 

这个阶段对于开发人员是很重要。在这个阶段,

them

e

被应用,所有的控件都被设置了唯一的

ID

。开发

人员在这个阶段可以调用

Init, 

InitComplete

PreLoad 

方法。微软关于这些方法使用的建议如下:

 

Init 

 

这个事件发生在所有控件被初始化并且皮肤设置也被应用后。使用这个事件来读取控件的初始化

值。

 

 

 

InitComplete 

 

这个事件被

Page

对象触发,使用这个事件处理那些要求所有初始化工作都完成后才能

做的事情。

 

PreLoad 

如果在页面或者控件进入

Load

事件前你有什么要处理的,使用这个事件。

Page

在触发这个

事件后,

Page

就会为自己和所有的控件加载

view state

并且处理所有

Request

中的

postback

数据。

 

3. 

Load 

这个阶段可能是开发者使用得最多的一个阶段。在这个阶段,所有的控件被

viewstate

中信息填充并被加

载,

OnLoad

事件被触发。

在这个阶段你可以为页面上所有的服务端控件设置属性,

得到

query 

strings

建立数据库连接。

 

4. 

Validation 

如果你的控件要求验证,验证会在这个阶段发生,这个时候你可以检查控件的

IsValid

属性。跟这个阶段

关联的事件是

Validate

,它有一个可以接受验证字符串群的重载方法

(

overload 

method)

,这个重载方

法执行特定控件群的验证。

 

5. 

Event 

Handling 

所有服务器端控件的事件处理发生在这个阶段。

也就是说

Click, 

SelectedIndexChanged

等等这些事件

会应用到你的服务器端控件,如果是页面请求是回传

(postback)

的话,这些事件的处理函数就会被控件触

发。这个阶段可以使用的事件如下:

 

LoadComplete 

 

在这个阶段,页面上所有的控件加载完毕

 

PreRender 

 

这里有几个重点,第一:页面对象

(page object)

会调用每一个控件的

EnsureChildCont

rols

函数,并最终调用自己的。其次:所有具有

DataSourceID

的数据绑定控件都会调用自己的

DataBi

nd

函数。要注意的一点是,

PreRender

事件会发生在一个页面的每一个控件上。在这个事件的最后,页

面和所有控件的

 

ViewState

被存储。

 

SaveStateComplete 

 

到这里,

ViewState

已经存储完毕,如果你有什么操作不需要修改控件但需要

修改

ViewState

的,可以放在

SaveStateComplete

里面。

 

6. 

Render 

渲染

(Render)

实际上不是一个事件,

页面对象调用每一个控件的

Render

方法从而按顺序的输出控件的

H

TML

代码。

编写用户自定义控件的开发者对这个阶段最感兴趣了,

因为输出用户自定义

HTML

代码的标准

做法就是重写

Render

方法。

如果你的控件是从

ASP.NET

服务器端控件继承来的,

你也许不需要重写

Re

nder

方法,

除非你想呈现一个与用户控件默认行为不同的行为。

这些都超出这个文档要讨论的范围了,

果想了解更多,

请参考

 

Microsoft's 

Developing Custom 

ASP.NET 

Server 

Controls. 

http://ms

dn2.microsoft./zt27com/en-us/librarytfhy.aspx) 

7. 

Unload 

最后这个事件首先是被各个控件逐一触发,最后被页面触发。在这个时刻,所有的控件已经被渲染为输出

(output stream)

并且无法被修改。

这个阶段中,

任何试图对

response stream

的操作都会引发异常。

这个事件主要用于做一些清理工作,比如关闭数据库连接和打开的文件或者登记事件记录等等其它任务。

 

页面周期中都有哪些方法

 

下面列出

ASP.NET

页面生命周期中所有的方法,这些方法都可以被重写

(override)

,要注意的是这些方

法有的会递归调用,有个会被页面中的内容重复调用,这个列表是按照页面加载时最通用的顺序排列的。

 

 

 

 

Construct 

ProcessRequest 

FrameworkInitialize 

 

 

InitializeCulture 

If 

child 

controls are present: 

AddParsedSubObject 

CreateControlCollection 

AddedControl 

ResolveAdapter 

DeterminePostBackMode 

OnPreInit 

OnInit 

TrackViewState 

OnInitComplete 

OnPreLoad 

OnLoad 

OnLoadComplete 

EnsureChildControls 

CreateChildControls 

OnPreRender 

OnPreRenderComplete 

SaveViewState 

OnSaveStateComplete 

CreateHtmlTextWriter 

RenderControl 

Render 

RenderChildren 

VerifyRenderingInServerForm 

OnUnload 

Dispose 

结论

 

在开发

ASP.NET

程序时,了解什么时候发生什么事情是非常重要的。理解页面中事件是如何层层展开节

省大量挠头和查错的时间。当这些页面周期中的事件难以记住时,我希望这个使用的法子能帮助你梳理出

在程序里哪个地方需要做什么处理。

 

我写这篇文章是为了帮助大家,也方便了自己。即使是熟练的开发人员有时也会忘记那些先那些后。这篇

文章不是面面俱到,而是希望给初学者和中级水平的开发者提供一些

小技巧

,从而帮助他们避免一些基

本的错误

 

0 0