文档章节

Asp.net页面生存周期

深圳大道
 深圳大道
发布于 2016/12/29 15:32
字数 2085
阅读 1
收藏 0

# 事件或方法 功能 描述   
1 Init 事件 页面初始化 初始化设置。   
2 LoadViewState 方法 加载视图状态 填充ViewState属性。   
3 LoadPostData 方法 处理回发数据 处理传入窗体数据。   
4 Load 事件 加载页面 页面控件初始化完成并反映了客户端的数据。   
5 RaisePostDataChangedEvent 方法 回发更改通知 引发更改事件。   
6 RaisePostBackEvent 方法 处理回发事件 处理引起回发的客户端事件,并在服务上引发相应时间。   
7 PreRender 事件 页面预呈现   
8 SaveViewState 方法 保存视图状态 将ViewState属性保存到字符串中。   
9 Render 方法 呈现页面   
10 Dispose 方法 处置 是否对昂贵资源的引用。   
11 Unload 事件 卸载页面

(转载)

对于ASP.NET开发者,理解ASP.NET的页面生命周期是非常重要的。主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性。但是记忆和理解页面生命周期里提供的事件处理方法(method)非常困难。互联网上有很多关于页面生命周期内部机制的文章,所以本文只准备简单覆盖技术的基础部分,更主要的目的是给大家提供一个简单得记忆页面生命周期的方法。

准确的记忆ASP.NET页面生命周期每一个阶段发生了什么事情是比较困难的,一种便于记忆的方法是根据各个阶段的名字组合出一个缩写。微软的文档给出的ASP.NET生命周期如下:

Page Request

Start

Page Initialization

Load

Validation

Postback event handling

Rendering

Unload

根据这个组合出一个缩写非常容易。既然Page Request技术上并不是页面生命周期的一部分(这个阶段仅仅标示我们是否开始一个页面周期或者从缓存加载一个页面),我们为了方便,就不包括这一阶段。

S – Start

I – Initialize

L – Load

V – Validate

E – Event Handling

R – Render

这样就组合出一个缩写“SILVER',这个英文单词非常好记。当然,一定要记住页面生命周期的最后一个环节unload没有包括在里面。如果你觉得有必要,你可以记忆为“SILVER-U”或者“SILVER-YOU",尽管有点破坏这个记忆法的完美性。现在,我们非常容易就记住了页面生命周期,接着我们总结一下每一步都发生了什么,都有什么事件伴随着发生。

1. Start

在这个阶段,页面属性,比如Request, Response, IsPostBack和UICulture 被创建。最为一个开发人员,大部分时候在这个阶段你不需要做任何事。如果你需要调用或者重写(override)这一阶段的行为,可以使用PreInit方法创建或者重新创建动态控件,设置master page或者theme或者读取和设置profile property的值。要注意的一点是,如果是回传(postback)的页面请求,所有控件的值还没有从view state里还原,如果你在这个阶段设置一个控件的值,这个值有可能在下面的阶段被重写并覆盖 2. Initialize

这个阶段对于开发人员是很重要。在这个阶段,theme被应用,所有的控件都被设置了唯一的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)会调用每一个控件的EnsureChildControls函数,并最终调用自己的。其次:所有具有DataSourceID的数据绑定控件都会调用自己的DataBind函数。要注意的一点是,PreRender事件会发生在一个页面的每一个控件上。在这个事件的最后,页面和所有控件的 ViewState被存储。

SaveStateComplete – 到这里,ViewState已经存储完毕,如果你有什么操作不需要修改控件但需要修改ViewState的,可以放在SaveStateComplete里面。

6. Render

渲染(Render)实际上不是一个事件,页面对象调用每一个控件的Render方法从而按顺序的输出控件的HTML代码。编写用户自定义控件的开发者对这个阶段最感兴趣了,因为输出用户自定义HTML代码的标准做法就是重写Render方法。如果你的控件是从ASP.NET服务器端控件继承来的,你也许不需要重写Render方法,除非你想呈现一个与用户控件默认行为不同的行为。这些都超出这个文档要讨论的范围了,如果想了解更多,请参考 Microsoft's Developing Custom ASP.NET Server Controls. ( http://msdn2.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程序时,了解什么时候发生什么事情是非常重要的。理解页面中事件是如何层层展开节省大量挠头和查错的时间。当这些页面周期中的事件难以记住时,我希望这个使用的法子能帮助你梳理出在程序里哪个地方需要做什么处理。

我写这篇文章是为了帮助大家,也方便了自己。即使是熟练的开发人员有时也会忘记那些先那些后。这篇文章不是面面俱到,而是希望给初学者和中级水平的开发者提供一些“小技巧”,从而帮助他们避免一些基本的错误

本文转载自:http://blog.csdn.net/smartsmile2012/article/details/51597562

深圳大道
粉丝 3
博文 877
码字总数 0
作品 0
深圳
架构师
私信 提问
【转载】ASP.Net请求处理机制初步探索之旅 - Part 3 管道

开篇:上一篇我们了解了一个ASP.Net页面请求的核心处理入口,它经历了三个重要的入口,分别是:ISAPIRuntime.ProcessRequest()、HttpRuntime.ProcessRequest()以及HttpApplication.Init()。其...

田乃翔
06/22
0
0
1.开始学习ASP.NET MVC

Hello,大家好! 好久没有开始记录博客了,是时候开始分享一下了,这个系列主要为零基础的同学,量身打造的。废话不多说,我们开干! 什么是ASP.NET MVC MVC(Model-View-Controller)--[模型--视...

灰太狼的梦想
02/27
0
0
ASP.NET MVC5 高级编程-学习日记-第一章 入门

1.1 ASP.NET MVC 简介 ASP.NET是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架。 1.1.1 MVC模式简介 MVC将应用程序的用户界面(User Interface, UI...

可达鸭要进化
2018/12/13
0
0
asp.net 的性能计数器

ASP.NET 支持两组性能计数器:系统和应用程序。前者在 ASP.NET 性能计数器对象中的 PerfMon 中公开;后者在 ASP.NET Applications 性能对象中公开。ASP.NET 性能对象中的 State Server Sessi...

晨曦之光
2012/03/09
132
0
ASP.NET保持用户状态的九种选择

2003-06-10 ■陶刚编译 ■yesky 摘要:ASP.NET为保持用户请求之间的数据提供了多种不同的途径。你可以使用Application对象、cookie、hidden fields、Sessions或Cache对象,以及它们的大量的方...

晨曦之光
2012/03/09
270
0

没有更多内容

加载失败,请刷新页面

加载更多

关于ThinkPHP5.1+的Log无法记录SQL调试记录的小经历

项目开发阶段,除了基本编码外,性能也需要实时关注与优化。之前我的大部分项目都是使用ThinkPHP5.0以及ThinkPHP3.2,对于框架提供的日志记录和日志配置都差不多,然后使用ThinkPHP5.1的时候...

北桥苏
32分钟前
1
0
TiDB Binlog 源码阅读系列文章(四)Pump server 介绍

作者: satoru 在 上篇文章 中,我们介绍了 TiDB 如何通过 Pump client 将 binlog 发往 Pump,本文将继续介绍 Pump server 的实现,对应的源码主要集中在 TiDB Binlog 仓库的 pump/server.go...

TiDB
35分钟前
0
0
OSChina 周五乱弹 ——不知道假装开心,装的像么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :天黑了 你很忧愁, 你说世界上, 找不到四块五的妞, 行走在凌晨两点的马路上, 你疲倦地拿着半盒黄鹤楼。#今日歌曲推荐# 《四块...

小小编辑
今天
2.5K
19
Windows下学习C语言有哪些集成开发软件?

前言 初学者学习C语言遇到的最大困难想必就是搭建环境了,相当多的初学者就是被搭建环境导致放弃了学习编程,就我自己的经验而言,初学编程不应该受限于环境,使用成熟好用的环境就可以了,之...

Allen5G
昨天
3
0
Hello,Servlet!

Servlet来源 上文说过了servlet是什么,我们从servlet是什么中也可以了解到servlet的来源:servlet是Java的一个类,并且能够运行在web容器上,所以servlet是按照web容器的规范和Java的规范写...

蒙尘
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部