ASPNET页面事件执行过程_第1页
ASPNET页面事件执行过程_第2页
ASPNET页面事件执行过程_第3页
ASPNET页面事件执行过程_第4页
ASPNET页面事件执行过程_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ASP.NET 母版页和内容页中的事件母版页和内容页都可以包含控件的事件处理程序。对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件。控件事件不会从内容页发送到母版页。同样,也不能在内容页中处理来自母版页控件的事件。在某些情况下,内容页和母版页中会引发相同的事件。例如,两者都引发 HYPERLINK /zh-cn/library/system.web.ui.control.init.aspx Init 和 HYPERLINK /zh-cn/library/system.web.ui.control.load.aspx Load 事件。引发事件

2、的一般规则是初始化事件从最里面的控件向最外面的控件引发,所有其他事件则从最外面的控件向最里面的控件引发。请记住,母版页会合并到内容页中并被视为内容页中的一个控件,这一点十分有用。下面是母版版页与内内容页合合并后事事件的发发生顺序序:母版页控件件 Innit 事件。内容控件 Iniit 事事件。母版页 IInitt 事件件。内容页 IInitt 事件件。内容页 LLoadd 事件件。母版页 LLoadd 事件件。内容控件 Loaad 事事件。内容页 PPreRRendder 事件。母版页 PPreRRendder 事件。母版页控件件 PrreReendeer 事事件。内容控件 PreeRennd

3、err 事件件。母版页和内内容页中中的事件件顺序对对于页面面开发人人员并不不重要。但但是,如如果您创创建的事事件处理理程序取取决于某某些事件件的可用用性,那那么您将将发现,了了解母版版页和内内容页中中的事件件顺序很很有帮助助。 HYPERLINK /Kevan/archive/2008/06/26/1230384.html 关于aspp.neet中页页面事件件加载的的先后顺顺序 Page 执行中中将按照照如下顺顺序激活活事件:Pagge.PPreIInittPagge.IInittPagge.IInittCommpliitePPagee.PrreLooadPPagee.LooadPPagee.

4、LooadCCompplettePaage.PreeRennderrPagge.PPreRRendderCCompplette如果页面从从另一个个页面继继承,如如BassePaage:Sysstemm.Weeb.UUI.PPagee,在BBaseePagge中做做了一些些扩展,如如权限检检查,而而其他页页面从BBaseePagge继承承,则BBaseePagge和最最终Paage的的事件激激活顺序序是:UUI.PPreIInittPagge.PPreIInittUI.IniitPaage.IniitUII.InnitCCompplittePaage.IniitCoomplliteeUI.Pre

5、eLoaadPaage.PreeLoaadUII.LooadPPagee.LooadUUI.LLoaddCommpleetePPagee.LooadCComppletteUII.PrreReendeerPaage.PreeRennderrUI.PreeRennderrCommpleetePPagee.PrreReendeerCoomplletee如果使使用了MMastterPPagee,则MMastterPPagee中的事事件和CConttenttPagge中的的事件按按照下面面顺序激激活:CConttenttPagge.PPreIInittMassterr.InnitCConttenttPa

6、gge.IInittConntenntPaage.IniitCoomplliteeConntenntPaage.PreeLoaadCoonteentPPagee.LooadMMastter.LoaadCoonteentPPagee.LooadCComppletteCoonteentPPagee.PrreReendeerMaasteer.PPreRRendderCConttenttPagge.PPreRRendderCCompplette更进进一步,如如果CoonteentPPagee继承BBaseePagge,那那么,各各事件的的执行顺顺序将变变成:UUI.PPreIInittConntenn

7、tPaage.PreeIniitMaasteer.IInittUI.IniitCoonteentPPagee.InnitUUI.IInittCommpliiteCConttenttPagge.IInittCommpliiteUUI.PPreLLoaddConntenntPaage.PreeLoaadUII.LooadCConttenttPagge.LLoaddMassterr.LooadUUI.LLoaddCommpleeteCConttenttPagge.LLoaddCommpleeteUUI.PPreRRendderCConttenttPagge.PPreRRendderMMastter.

8、PreeRennderrUI.PreeRennderrCommpleeteCConttenttPagge.PPreRRendderCCompplette浏览下来发发现并不不是我现现在所学学的assp.nnet 1.11,估计计应该是是aspp.neet 22.0,不过也没有有关系,这这让我知知道了他他们有继继承时加加载的顺顺序。即:先加载载继承页页的,再再加载自自己的,如如果继承承页有继继承则先先加载继继承页的的继承。其实是个很很简单的的内容。顺顺便写下下Pagge事件件(不知知道1.1是不不是就这这些)事件处理器器名称发生时间Page_Iniit在Web窗窗体的视视图状态态加载服服务器控控件

9、并对对其初始始化。这是webb窗体生生命周期期的第一一步 Page_Loaad在Pagee对象上上载入服服务器控控件。由由于此时时视图状状态信息息是可以以使用的的,因此载这里里可以用用代码来来改变空空间的设设置或者者载页面面上显示示文本。 Page_PreeRennderr 应用程序将将要呈现现Pagge对象象 Page_Unlloadd 页面从内存存中卸载载 Page_Errror发生未处理理的异常常Page_AboortTTrannsacctioon 事务处理被被终止 Page_CommmittTraansaactiion 事务处理被被接受 Page_DattaBiindiing 把页面上

10、的的服务器器空间和和数据源源绑定载载一起 Page_DisspossedPage对对象从内内存中释释放掉。这这是Paage对对象生命命周期中中的最后后一个事事件 Init,Loaad,PPreRRendder事事件执行行顺序:1)控控件的IInitt事件22)控件件所在页页面的IInitt事件33)控件件所在页页面的LLoadd事件44)控件件的Looad事事件5)控控件所在在页面的的PreeRennderr事件66)控件件的PrreReendeer事件件规律:1)IInitt事件从从最里面面的控件件(包括括用户控控件及普普通控件件)向最最外面的的控件(页页面)引引发,LLoadd及PrreR

11、eendeer等其其他事件件从最外外面的控控件向最最里面的的控件引引发;22)控件件之间相相同事件件的执行行顺序依依控件在在页面的的位置按按从左到到右,从从上到下下的先后后顺序执执行。注注意:11)切记记用户控控件也被被视为页页面中的的一个控控件;22)把用用户控件件作为单单独的一一个特殊殊页面来来看,它它本身及及其所包包含的控控件同样样遵守相相同的规规律;33)有时时在客户户端程序序(如jjavaascrriptt)中会会用到客客户端bbodyy对像的的onlloadd事件,注注意这个个客户端端事件是是最后执执行,即即在服务务器端所所有事件件执行完完后才执执行。测测试环境境:Wiindoow

12、s220000 Prro+IIIS55.0+Dottnett Frrameeworrk1.1=转载一一篇关于于页面对对象模型型的文章章,说得得比较详详细,有有助理解解。没事事的时候候就多看看两遍,慢慢慢体会会:)。ASP.NNET 页面对对象模型型Dino EspposiitoWWinttelllectt 2003 年 88 月适用于: Microsoft ASP.NET 摘要:了解为 ASP.NET Web 页面建立的事件模型,以及 Web 页面转变为 HTML 过程中的各个阶段。ASP.NET HTTP 运行时负责管理对象管道,这些对象首先将请求的 URL 转换成 Page 类的具体实例,

13、然后再将这些实例转换成纯 HTML 文本。本文将探讨那些作为页面生命周期标志的事件,以及控件和页面编写者如何干预并改变标准行为。(本文包含一些指向英文站点的链接。)目录简介真正的 Page 类页面的生命周期执行的各个阶段小结简介 对由 Microsoft Internet 信息服务 (IIS) 处理的 Microsoft ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道。HTTP 管道由一系列托管对象组成,这些托管对象按顺序处理请求,并将 URL 转换为纯 HTML 文本。HTTP 管道的入口是 HttpRuntime 类。ASP.NET 结构为辅助进程中的每个 Ap

14、pDomain 创建一个此类的实例。(请注意,辅助进程为每个当前正在运行的 ASP.NET 应用程序维护一个特定的 AppDomain。)HttpRuntime 类从内部池中获取 HttpApplication 对象,并安排此对象来处理请求。HTTP 应用程序管理器完成的主要任务就是找到将真正处理请求的类。当请求 .aspx 资源时,处理程序就是页面处理程序,即从 Page 继承的类的实例。资源类型和处理程序类型之间的关联关系存储在应用程序的配置文件中。更确切地说,默认的映射集是在 machine.config 文件的 部分定义的。但是,应用程序可以在本地的 web.config 文件中自定义

15、自己的 HTTP 处理程序列表。以下这一行代码就是用来为 .aspx 资源定义 HTTP 处理程序的。 扩展名可以与处理程序类相关联,并且更多是与处理程序工厂类相关联。在所有情况下,负责处理请求的 HttpApplication 对象都会获得一个实现 IHttpHandler 接口的对象。如果根据 HTTP 处理程序来解析关联的资源/类,则返回的类将直接实现接口。如果资源被绑定到处理程序工厂,则还需要额外的步骤。处理程序工厂类实现 IHttpHandlerFactory 接口,此接口的 GetHandler 方法将返回一个基于 IHttpHandler 的对象。HTTP 运行时是如何结束这个循

16、环并处理页面请求的?ProcessRequest 方法在 IHttpHandler 接口中非常重要。通过对代表被请求页面的对象调用此方法,ASP.NET 结构会启动将生成浏览器输出的进程。真正的 Page 类 特定页面的 HTTP 处理程序类型取决于 URL。首次调用 URL 时,将构建一个新的类,这个类被动态编译为一个程序集。检查 .aspx 资源的分析进程的结果是类的源代码。该类被定义为命名空间 ASP 的组成部分,并且被赋予了一个模拟原始 URL 的名称。例如,如果 URL 的终点是 page.aspx,则类的名称就是 ASP.Page_aspx。不过,类的名称可以通过编程方式来控制,方

17、法是在 Page 指令中设置 ClassName 属性。HTTP 处理程序的基类是 Page。这个类定义了由所有页面处理程序共享的方法和属性的最小集合。Page 类实现 IHttpHandler 接口。在很多情况下,实际处理程序的基类并不是 Page,而是其他的类。例如,如果使用了代码分离,就会出现这种情况。代码分离是一项开发技术,它可以将页面所需的代码隔离到单独的 C# 和 Microsoft Visual Basic .NET 类中。页面的代码是一组事件处理程序和辅助方法,这些处理程序和方法真正决定了页面的行为。可以使用 标记对此代码进行内联定义,或者将其放置在外部类(代码分离类)中。代码

18、分离类是从 Page 继承并使用额外的方法的类,被指定用作 HTTP 处理程序的基类。还有一种情况,HTTP 处理程序也不是基于 Page 的,即在应用程序配置文件的 部分中,包含了 PageBaseType 属性的重新定义。 PageBaseType 属性指明包含页面处理程序的基类的类型和程序集。从 Page 导出的这个类可以自动赋予处理程序扩展的自定义方法和属性集。页面的生命周期 完全识别 HTTP 页面处理程序类后,ASP.NET 运行时将调用处理程序的 ProcessRequest 方法来处理请求。通常情况下,无需更改此方法的实现,因为它是由 Page 类提供的。此实现将从调用为页面构

19、建控件树的 FrameworkInitialize 方法开始。FrameworkInitialize 方法是 TemplateControl 类(Page 本身从此类导出)的一个受保护的虚拟成员。所有为 .aspx 资源动态生成的处理程序都将覆盖 FrameworkInitialize。在此方法中,构建了页面的整个控件树。接下来,ProcessRequest 使页面经历了各个阶段:初始化、加载视图状态信息和回发数据、加载页面的用户代码以及执行回发服务器端事件。之后,页面进入显示模式:收集更新的视图状态,生成 HTML 代码并随后将代码发送到输出控制台。最后,卸载页面,并认为请求处理完毕。在各个

20、阶段中,页面会触发少数几个事件,这些事件可以由 Web 控件和用户定义的代码截取并进行处理。其中的一些事件是嵌入式控件专用的,因此无法在 .aspx 代码级进行处理。要处理特定事件的页面应该明确注册一个适合的处理程序。不过,为了向后兼容早期的 Visual Basic 编程风格,ASP.NET 也支持隐式事件挂钩的形式。默认情况下,页面会尝试将特定的方法名称与事件相匹配,如果实现匹配,则认为此方法就是匹配事件的处理程序。ASP.NET 提供了六种方法名称的特定识别,它们是 Page_Init、Page_Load、Page_DataBind、Page_PreRender 和 Page_Unloa

21、d。这些方法被认为是由 Page 类提供的相应事件的处理程序。HTTP 运行时会自动将这些方法绑定到页面事件,这样,开发人员就不必再编写所需的粘接代码了。例如,如果命名为 Page_Load 的方法绑定到页面的 Load 事件,则可省去以下代码。this.Load += new EventHandler(this.Page_Load); 对特定名称的自动识别是由 Page 指令的 AutoEventWireup 属性控制的。如果该属性设置为 false,则要处理事件的所有应用程序都需要明确连接到页面事件。不使用自动绑定事件的页面性能会稍好一些,因为不需要额外匹配名称与事件。请注意,所有 Mic

22、rosoft Visual Studio .NET 项目都是在禁用 AutoEventWireup 属性的情况下创建的。但是,该属性的默认设置是 true,即 Page_Load 等方法会被识别,并被绑定到相关联的事件。下表中按顺序列出了页面的执行包括的几个阶段,执行的标志是一些应用程序级的事件和/或受保护并可覆盖的方法。表 1:ASP.NET 页面生命中的关键事件阶段页面事件可覆盖的方法页面初始化Init加载视图状态LoadViewState处理回发数据任意实现 IPostBackDataHandler 接口的控件中的 LoadPostData 方法加载页面Load回发更改通知任意实现 IP

23、ostBackDataHandler 接口的控件中的 RaisePostDataChangedEvent 方法处理回发事件由控件定义的任意回发事件任意实现 IPostBackDataHandler 接口的控件中的 RaisePostBackEvent 方法页面显示前阶段PreRender保存视图状态SaveViewState显示页面Render卸载页面Unload以上所列的阶段中有些在页面级是不可见的,并且仅对服务器控件的编写者和要创建从 Page 导出的类的开发人员有意义。Init、Load、PreRender、Unload,再加上由嵌入式控件定义的所有回发事件,就构成了向外发送页面的各个阶

24、段标记。执行的各个阶段 页面生命周期中的第一个阶段是初始化。这个阶段的标志是 Init 事件。在成功创建页面的控件树后,将对应用程序触发此事件。换句话说,当 Init 事件发生时,.aspx 源文件中静态声明的所有控件都已实例化并采用各自的默认值。控件可以截取 Init 事件以初始化在传入的 Web 请求的生命周期内所需的所有设置。例如,这时控件可以加载外部模板文件或设置事件的处理程序。请注意,这时视图状态信息尚不可用。初始化之后,页面框架将加载页面的视图状态。视图状态是名称/值对的集合,在此集合中,控件和页面本身存储了对所有 Web 请求都必须始终有效的全部信息。视图状态代表了页面的调用上下

25、文。通常,它包含上次在服务器上处理页面时控件的状态。首次在会话中请求页面时,视图状态为空。默认情况下,视图状态存储在静默添加到页面的隐藏字段中,该字段的名称是 _VIEWSTATE。通过覆盖 LoadViewState 方法(Control 类的受保护、可覆盖方法),组件开发人员可以控制视图状态的存储方式以及视图状态的内容映射到内部状态的方式。有些方法(如 LoadPageStateFromPersistenceMedium 以及其对应的 SavePageStateToPersistenceMedium),可以用来将视图状态加载并保存到其他存储介质(例如会话、数据库或服务器端文件)中。与 Lo

26、adViewState 不同,上述方法只能在从 Page 导出的类中使用。存储视图状态之后,页面树中控件的状态与页面最后一次显示在浏览器中的状态相同。下一步是更新它们的状态以加入客户端的更改。处理回发数据阶段使控件有机会更新其状态,从而准确反映客户端相应的 HTML 元素的状态。例如,服务器的 TextBox 控件对应的 HTML 元素是 。在回发数据阶段,TextBox 控件将检索 标记的当前值,并使用该值来刷新自己内部的状态。每个控件都要从回发的数据中提取值并更新自己的部分属性。TextBox 控件将更新它的 Text 属性,而 CheckBox 控件将刷新它的 Checked 属性。服务

27、器控件和 HTML 元素的对应关系可以通过二者的 ID 找到。在处理回发数据阶段的最后,页面中的所有控件的状态都将使用客户端输入的更改来更新前一状态。这时,将对页面触发 Load 事件。页面中可能会有一些控件,当其某个敏感属性在两个不同的请求中被修改时,需要完成特定的任务。例如,如果 TextBox 控件的文本在客户端被修改,则此控件将触发 TextChanged 事件。每个控件在其一个或多个属性被修改为客户端输入的值时都可以决定触发相应的事件。对于这些更改对其非常关键的控件,控件实现 IPostBackDataHandler 接口,此接口的 LoadPostData 方法是在 Load 事件后立即调用的。通过对 LoadPostData 方法进行编码,控件将验证自上次请求后是否发生了关键更改,并触发自

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论