ASP.NET页的生命周期

asp面加载事件顺序 面加载事件的实例,可以更加深入的理解asp面加载的流程的理解! 立即下载

ASP.NET页的生命周期


作者:Solomon Shaffer        翻译:吕绍伟

简介


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

1.对象初始化


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


图1 控件基于声明被初始化

2.加载视图状态数据


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


图2 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 来重载,如图3。

图3 OnLoad事件是放置逻辑的理想位置

5.激发RaisePostDataChanged 事件

如前所述,这发生在所有实现了IPostBackDataHandler接口的控件被正确的回传数据更新以后。在这个过程中,每个控件都有一个布尔值的标识,标识其自上一次提交后该控件的数据是被更改还是保持原值。然后ASP.NET通过搜索页来寻找任何显示控件数据被更改的标识并激发RaisePostDataChanged。RaisePostDataChanged事件直到Load事件发生后,所有控件被更新后才激发。这保证了在控件被回传数据更新前,其它控件的数据在RaisePostDataChanged事件中没有被手动更改过。

6.处理客户端回传事件

当回传更新导致数据改变而引发服务器端事件后,引发回传的对象会在RaisePostBackEvent事件中被处理。这种激发回传的对象往往是其状态改变而引发回传的控件(其autopostback被启用)或者是一个被点击的窗体提交按钮。很多代码都在这个事件中执行,因为这是控制事件驱动逻辑的理想位置。为了保证呈现到浏览器的数据的正确性,在一系列的回传事件后RaisePostBackEvent事件最终被激发。基于一致性的考虑,回传中改变的控件直到这个函数被执行后才被更新。也就是说,被预期事件改变的数据总是在结果页反映出来。RaisePostBackEvent事件可以通过RaisePostBackEvent来捕捉,如图4

图4 RaisePostDataChanged和RaisePostBackEvent由IPostBackDataHandler接口定义

7.对象预呈现

对象被预呈现的地方对于那些能够保存到视图或者维持其视图状态的对象来说是最后一次有机会改变的地方。这使得预呈现步骤成为做最后修改的理想位置,例如改变控件属性或改变控件树结构,不用担心因为数据库请求或者视图状态更新而导致对象的变化。预呈现阶段之后,对象改变被锁定并且不能再被保存到页视图状态中。预呈现阶段可以通过重载OnPreRender实现。

8.保存视图状态

只有在所有的页面对象的改变都发生后视图状态才被保存。对象状态数据被保存在隐藏<input>对象中,这也是对象状态数据准备呈现到HTML的地方。在SaveViewState事件中,值能够被保存到视图状态对象中,但页面控件的改变并不能保存到其中。可以通过重载SaveViewState实现这个步骤,如图5所示:

图5 在OnPreRender中值被设置给控件。在SaveViewState中,值被设置给视图状态对象。

9.呈现HTML

Render事件通过装配用于浏览器输出的HTML来着手页的创建。在Render事件中,页调用对象使它们呈现为HTML,然后页收集HTML来发送。当Render事件被重载的时候,开发者可以为浏览器创建定制的HTML,此时页面创建的任何HTML都还没有生效。Render 方法用HtmlTextWriter对象作参数并由它产生HTML给浏览器。这里仍然可以作修改,但是这样的修改只会反映到客户(译者注:意即改变只会在HTML呈现中反映而视图状态并无法被改变)。Render 事件可以被重载,如图6(下面)

 

10.释放

当页面的HTML呈现后,对象被释放。在Dispose事件中,你可以清除任何在页面创建中构造的对象或者引用。在这里,所有的处理都已经被执行,你可以安全的释放任何还存在的对象,包括Page对象。Dispose能被重载,如图6.

图6 Render事件通过HtmlTextWriter对象为浏览器产生定制HTML

总结

每次我们请求一个ASP.NET页的时候,这个从初始化到释放的过程都同样的被执行。通过理解ASP.NET页的内部执行过程,编写和调试代码的时候就会更加容易和高效(更不用提会碰到更少的让我们灰心的事)。

ASP.NET面执行顺序 1.对象初始化(OnInit方法)    面中的控件(包括面本身)都是在它们最初的FORM中被首次初始化的。通过在ASPX面的后台代码文件的构造器中声明你的对象,面将知道对象的类型,并知道需要创建多少个这样的对象。一旦你在构造器中声明了你的控件,你就可以在它的任何子类,方法,事件或者属性中访问到它们。但是,如果你的任何对象是在ASPX文件中指定的控件,这样的控件是没有属性的。而且这样做 阅读详情

相关推荐

ASP.NET面事件执行过程(完整版)

ASP.NET 母版和内容中的事件 母版和内容都可以包含控件的事件处理程序。对于控件而言,事件是在本地处理的,即内容中的控件在内容中引发事件,母版中的控件在母版中引发事件。控件事件不会从内容发送到母版。同样,也不能在内容中处理来自母版控件的事件。

ATCO[这里,只是顺手插曲] 1005

关于Asp.NET面事件加载的先后顺序

关于Asp.NET面事件加载的先后顺序

菜鸟葫芦娃 1万+

asp.net 面的事件执行顺序

默认的aspx面都是继承自System.Web.UI.Page,Page基类定义了很多需要预执行的事件,这些事件虽没有在aspx面中显示的定义或提及,但它们仍然会以一定的顺序去执行,这些事件的执行顺序是: 1. OnPreInit 2. OnInit 3. OnInitComplete 4. OnPreLoad 5. Page_Load 6. OnLoad 7. OnLoadComplete...

pavel0的专栏 198

ASP.NET 生命周期

ASP.NET 运行时,此将经历一个生命周期,在生命周期中将执行一系列处理步骤。这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。了解生命周期非常重要,因为这样做我们就能在生命周期的合适阶段编写代码,以达到预期效果。此外,如果要开发自定义控件,就必须熟悉生命周期,以便正确进行控件初始化,使用视图状态数据填充控件属性以及运行任何控件行为代...

aonordcv69558的博客 145

ASP.NET 生命周期概述

阶段 说明 请求 请求发生在生命周期开始之前。用户请求时,ASP.NET 将确定是否需要分析和编译(从而开始生命周期),或者是否可以在不运行的情况下发送的缓存版本以进行响应。 开始 在开始阶段,将设置属性,如 Request 和 Response。在此阶段,还将确定请求是回发请求还是新请求,并设置 IsPostBack 属性。此外,在开始阶段期间,还将设置的 UICulture 属性。 初始化 初始化期间,可以使用中的控件,并将设置每个控件的

okhui的专栏 338

Asp.net生命周期概述

Asp.net运行时,此将经历一个生命周期,在生命周期中将执行一系列处理步骤。这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。了解生命周期非常重要,因为这样做您就能在生命周期的合适阶段编写代码,以达到预期效果。此外,如果您要开发自定义控件,就必须熟悉生命周期,以便正确进行控件初始化,使用视图状态数据填充控件属性以及运行任何控件行为代码。(控件的生命周期基于...

weixin_30555753的博客 77

.NET ASP.NET 生命周期

ASP.NET 生命周期概述 ASP.NET 运行时,此将经历一个生命周期,在生命周期中将执行一系列处理步骤。 这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。 了解生命周期非常重要,因为这样做您就能在生命周期的合适阶段编写代码,以达到预期效果。 如果您要开发自定义控件,就必须熟悉生命周期,以便正确进行控件初始化,使用视图状态数据填充控件属性以及运行控件...

weixin_44870681的博客 252

ASP.NET生命周期

一般来说,要经历下面概述的各个阶段。除了生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于请求 请求发生在生命周期开始之前。用户请求时,ASP.NET 将确定是否需要分析和编译(从而开始生命周期),或者是否可以在不运行的情况下发送的缓存版本以进行响应。开始 在开始阶段,将设置属性,如 和 。在此阶段...

雷军是我弟 97

asp.net 生命周期

<br />ASP.NET 运行时,此将经历一个生命周期,在生命周期中将执行一系列处理步骤。这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行 呈现。了解生命周期非常重要,因为这样做您就能在生命周期的合适阶段编写代码,以达到预期效果。此外,如果您要开发自定义控件,就必须熟悉生命周期, 以便正确进行控件初始化,使用视图状态数据填充控件属性以及运行任何控件行为代码。(控件的生命周期基于生命周期,但是引发的控件事件比单独的 ASP.NET 中可用的事件多。)

ahjd110的专栏 358
上一篇: 在ASP.NET中把图片保存到SQL SERVER数据库
下一篇: 在.NET框架1.0和1.1下并行执行ASP.NET
comy
博客等级 码龄24年 20粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值