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

下载本文档

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

文档简介

ASP.NET母版页和内容页中的事件母版页和内容页都可以包含控件的事件处理程序。对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件。控件事件不会从内容页发送到母版页。同样,也不能在内容页中处理来自母版页控件的事件。在某些情况下,内容页和母版页中会引发相同的事件。例如,两者都引发Init和Load事件。引发事件的一般规则是初始化事件从最里面的控件向最外面的控件引发,所有其他事件则从最外面的控件向最里面的控件引发。请记住,母版页会合并到内容页中并被视为内容页中的一个控件,这一点十分有用。下面是母版页与内容页合并后事件的发生顺序:母版页控件Init事件。内容控件Init事件。母版页Init事件。内容页Init事件。内容页Load事件。母版页Load事件。内容控件Load事件。内容页PreRender事件。母版页PreRender事件。母版页控件PreRender事件。内容控件PreRender事件。母版页和内容页中的事件顺序对于页面开发人员并不重要。但是,如果您创建的事件处理程序取决于某些事件的可用性,那么您将发现,了解母版页和内容页中的事件顺序很有帮助。关于中页面事件加载的先后顺序冈Page眠执行中将按患照如下顺序棒激活事件:暖Page.辣PreIn并it跃Page.荡Init折Page.染InitC视ompli盟te妈Page.柏PreLo政ad叼Page.各Load澡Page.昌LoadC斜omple汤te筐Page.吊PreRe幼nder峰Page.对PreRe漏nderC缝omple言te袭如果页面从签另一个页面军继承,如B鹿asePa航ge:Sy煌stem.军Web.U壳I.Pag饿e,在Ba狡sePag区e中做了一隆些扩展,如般权限检查,各而其他页面鞠从Base恢Page继由承,则Ba防sePag蛋e和最终P社age的事念件激活顺序脚是:搂UI.Pr篮eInit奸Page.晓PreIn臣it梨UI.In钱it近Page.则Init式UI.In所itCom秃plite救Page.爆InitC科ompli忌te饺UI.Pr诚eLoad逝Page.纽PreLo引ad龙UI.Lo逗ad恩Page.免Load露UI.Lo殖adCom步plete拜Page.员LoadC形omple炊te毒UI.Pr府eRend锡er掠Page.见PreRe邪nder环UI.Pr搭eRend洋erCom菌plete校Page.借PreRe呼nderC塑omple负te搂如果使用了敬Maste捉rPage挥,则Mas熟terPa爽ge中的事舒件和Con托tentP浩age中的宾事件按照下两面顺序激活着:拾Conte思ntPag师e.Pre踏Init商Maste鹿r.Ini粗t则Conte鉴ntPag提e.Ini狂t暗Conte篇ntPag斧e.Ini删tComp存lite次Conte脖ntPag员e.Pre慨Load个Conte拴ntPag坐e.Loa爸d垫Maste瞧r.Loa凳d尖Conte配ntPag返e.Loa烘dComp蝶lete摧Conte主ntPag梯e.Pre手Rende谊r鉴Maste纸r.Pre碍Rende阴r障Conte倚ntPag长e.Pre件Rende卫rComp驼lete缝更进一步,遍如果Con泳tentP服age继承尿BaseP倾age,那同么,各事件富的执行顺序划将变成:亮UI.Pr税eInit蛮Conte公ntPag鸭e.Pre滴Init心Maste钢r.Ini锋t织UI.In腿it店Conte沉ntPag皮e.Ini客t捞UI.In支itCom碗plite霜Conte骗ntPag桐e.Ini棉tComp设lite龟UI.Pr瓦eLoad突Conte甲ntPag料e.Pre谋Load药UI.Lo胁ad幅Conte段ntPag霜e.Loa肉d找Maste封r.Loa构d减UI.Lo闯adCom谜plete好Conte鲁ntPag尚e.Loa没dComp殃lete荐UI.Pr蜻eRend订er贞Conte祸ntPag小e.Pre鞋Rende枝r扩Maste谅r.Pre专Rende皂r肤UI.Pr苹eRend吉erCom等plete掘Conte脑ntPag惠e.Pre交Rende献rComp着lete弱浏览下来发督现并不是我轧现在所学的浆asp.n声et1.犯1,估计应付该是asp无.net决2.0,库不过也没有膀关系,这让英我知道了他张们有继承时租加载的顺序炕。躬即:先加载狼继承页的,阁再加载自己夕的,如果继踩承页有继承抛则先加载继现承页的继承家。赠其实是个很杏简单的内容闻。顺便写下乳Page事留件(不知道凉1.1是不仙是就这些)五事件处理器治名称护发生时间纽Page_限Init赚在Web窗搁体的视图状贷态加载服务宫器控件并对庙其初始化。元这是web棵窗体生命周办期的第一步养挥Page_河Load解在Page连对象上载入凉服务器控件鼻。由于此时昏视图状态信坚息是可以使应用的,怀因此载这里绝可以用代码乔来改变空间墙的设置或者迅载页面上显厚示文本。瞒Page_凝PreRe享nder杯应用程序将碧要呈现Pa们ge对象限Page_妈Unloa类d旱页面从内存裁中卸载云Page_最Error痛发生未处理膏的异常钟Page_抗Abort格Trans鹿actio今n要事务处理被柜终止旬Page_魂Commi业tTran芳sacti头on绩事务处理被而接受辩Page_连DataB炎indin杜g捎把页面上的撒服务器空间欣和数据源绑形定载一起基Page_跨Dispo慰sed驱Page对借象从内存中有释放掉。这吗是Page点对象生命周鼓期中的最后足一个事件锡选Init,大Load,倒PreRe奇nder事粗件执行顺序椒:痰1)控件的里Init事牧件量2)控件所起在页面的I惕nit事件睁3)控件所音在页面的L杯oad事件座4)控件的兄Load事搏件屈5)控件所孩在页面的P渗reRen育der事件用6)控件的捏PreRe抵nder事而件左规律:药1)Ini育t事件从最冻里面的控件燥(包括用户切控件及普通剖控件)向最缩外面的控件份(页面)引低发,Loa五d及Pre拉Rende厌r等其他事睛件从最外面嘱的控件向最搜里面的控件问引发;舌2)控件之用间相同事件呀的执行顺序嫌依控件在页捕面的位置按壤从左到右,晶从上到下的辱先后顺序执定行。乱注意:谁1)切记用昆户控件也被海视为页面中返的一个控件阅;谈2)把用户鄙控件作为单浴独的一个特魂殊页面来看之,它本身及费其所包含的蔬控件同样遵扇守相同的规爆律;牺3)有时在仗客户端程序苹(如jav细ascri娱pt)中会含用到客户端理body对均像的onl半oad事件文,注意这个呢客户端事件抄是最后执行蹦,即在服务小器端所有事领件执行完后妖才执行。怪测试环境:痛Windo漏ws200票0Pro症+IIS5娃.0+Do吧tnet逐Frame查work1蠢.1闹=====屋=====冲=====盟=====更=====奖=====纲=====辰=====摘=====启=====局=====违=====宜=====具=====霉=====阻=====碧===谨转载一篇关幕于页面对象主模型的文章调,说得比较角详细,有助买理解。没事厅的时候就多躲看两遍,慢惠慢体会:)耐。要ASP.N诚ET页面击对象模型照Dino端Espos暴ito

轧Winte精llect垃引2003亡年8月欲适用于:

Microsoft®ASP.NET摘要:了解为ASP.NETWeb页面建立的事件模型,以及Web页面转变为HTML过程中的各个阶段。ASP.NET运行时负责管理对象管道,这些对象首先将请求的URL转换成Page类的具体实例,然后再将这些实例转换成纯HTML文本。本文将探讨那些作为页面生命周期标志的事件,以及控件和页面编写者如何干预并改变标准行为。(本文包含一些指向英文站点的链接。)目录简介

真正的Page类

页面的生命周期

执行的各个阶段

小结简介对由Microsoft®Internet信息服务(IIS)处理的Microsoft®ASP.NET页面的每个请求都会被移交到ASP.NET管道。管道由一系列托管对象组成,这些托管对象按顺序处理请求,并将URL转换为纯HTML文本。管道的入口是Runtime类。ASP.NET结构为辅助进程中的每个AppDomain创建一个此类的实例。(请注意,辅助进程为每个当前正在运行的ASP.NET应用程序维护一个特定的AppDomain。)Runtime类从内部池中获取Application对象,并安排此对象来处理请求。应用程序管理器完成的主要任务就是找到将真正处理请求的类。当请求.aspx资源时,处理程序就是页面处理程序,即从Page继承的类的实例。资源类型和处理程序类型之间的关联关系存储在应用程序的配置文件中。更确切地说,默认的映射集是在machine.config文件的<Handlers>部分定义的。但是,应用程序可以在本地的web.config文件中自定义自己的处理程序列表。以下这一行代码就是用来为.aspx资源定义处理程序的。<addverb="*"path="*.aspx"type="System.Web.UI.PageHandlerFactory"/>扩展名可以与处理程序类相关联,并且更多是与处理程序工厂类相关联。在所有情况下,负责处理请求的Application对象都会获得一个实现IHandler接口的对象。如果根据处理程序来解析关联的资源/类,则返回的类将直接实现接口。如果资源被绑定到处理程序工厂,则还需要额外的步骤。处理程序工厂类实现IHandlerFactory接口,此接口的GetHandler方法将返回一个基于IHandler的对象。运行时是如何结束这个循环并处理页面请求的?ProcessRequest方法在IHandler接口中非常重要。通过对代表被请求页面的对象调用此方法,ASP.NET结构会启动将生成浏览器输出的进程。真正的Page类特定页面的处理程序类型取决于URL。首次调用URL时,将构建一个新的类,这个类被动态编译为一个程序集。检查.aspx资源的分析进程的结果是类的源代码。该类被定义为命名空间ASP的组成部分,并且被赋予了一个模拟原始URL的名称。例如,如果URL的终点是page.aspx,则类的名称就是ASP.Page_aspx。不过,类的名称可以通过编程方式来控制,方法是在@Page指令中设置ClassName属性。处理程序的基类是Page。这个类定义了由所有页面处理程序共享的方法和属性的最小集合。Page类实现IHandler接口。在很多情况下,实际处理程序的基类并不是Page,而是其他的类。例如,如果使用了代码分离,就会出现这种情况。代码分离是一项开发技术,它可以将页面所需的代码隔离到单独的C#和MicrosoftVisualBasic®.NET类中。页面的代码是一组事件处理程序和辅助方法,这些处理程序和方法真正决定了页面的行为。可以使用<scriptrunat=server>标记对此代码进行内联定义,或者将其放置在外部类(代码分离类)中。代码分离类是从Page继承并使用额外的方法的类,被指定用作处理程序的基类。还有一种情况,处理程序也不是基于Page的,即在应用程序配置文件的<pages>部分中,包含了PageBaseType属性的重新定义。<pagesPageBaseType="Classes.MyPage,mypage"/>PageBaseType属性指明包含页面处理程序的基类的类型和程序集。从Page导出的这个类可以自动赋予处理程序扩展的自定义方法和属性集。页面的生命周期完全识别页面处理程序类后,ASP.NET运行时将调用处理程序的ProcessRequest方法来处理请求。通常情况下,无需更改此方法的实现,因为它是由Page类提供的。此实现将从调用为页面构建控件树的FrameworkInitialize方法开始。FrameworkInitialize方法是TemplateControl类(Page本身从此类导出)的一个受保护的虚拟成员。所有为.aspx资源动态生成的处理程序都将覆盖FrameworkInitialize。在此方法中,构建了页面的整个控件树。接下来,ProcessRequest使页面经历了各个阶段:初始化、加载视图状态信息和回发数据、加载页面的用户代码以及执行回发服务器端事件。之后,页面进入显示模式:收集更新的视图状态,生成HTML代码并随后将代码发送到输出控制台。最后,卸载页面,并认为请求处理完毕。在各个阶段中,页面会触发少数几个事件,这些事件可以由Web控件和用户定义的代码截取并进行处理。其中的一些事件是嵌入式控件专用的,因此无法在.aspx代码级进行处理。要处理特定事件的页面应该明确注册一个适合的处理程序。不过,为了向后兼容早期的VisualBasic编程风格,ASP.NET也支持隐式事件挂钩的形式。默认情况下,页面会尝试将特定的方法名称与事件相匹配,如果实现匹配,则认为此方法就是匹配事件的处理程序。ASP.NET提供了六种方法名称的特定识别,它们是Page_Init、Page_Load、Page_DataBind、Page_PreRender和Page_Unload。这些方法被认为是由Page类提供的相应事件的处理程序。运行时会自动将这些方法绑定到页面事件,这样,开发人员就不必再编写所需的粘接代码了。例如,如果命名为Page_Load的方法绑定到页面的Load事件,则可省去以下代码。this.Load+=newEventHandler(this.Page_Load);对特定名称的自动识别是由@Page指令的AutoEventWireup属性控制的。如果该属性设置为false,则要处理事件的所有应用程序都需要明确连接到页面事件。不使用自动绑定事件的页面性能会稍好一些,因为不需要额外匹配名称与事件。请注意,所有MicrosoftVisualStudio®.NET项目都是在禁用AutoEventWireup属性的情况下创建的。但是,该属性的默认设置是true,即Page_Load等方法会被识别,并被绑定到相关联的事件。下表中按顺序列出了页面的执行包括的几个阶段,执行的标志是一些应用程序级的事件和/或受保护并可覆盖的方法。表1:ASP.NET页面生命中的关键事件阶段页面事件可覆盖的方法页面初始化Init加载视图状态LoadViewState处理回发数据任意实现IPostBackDataHandler接口的控件中的LoadPostData方法加载页面Load回发更改通知任意实现IPostBackDataHandler接口的控件中的RaisePostDataChangedEvent方法处理回发事件由控件定义的任意回发事件任意实现IPostBackDataHandler接口的控件中的RaisePostBackEvent方法页面显示前阶段PreRender保存视图状态SaveViewState显示页面Render卸载页面Unload以上所列的阶段中有些在页面级是不可见的,并且仅对服务器控件的编写者和要创建从Page导出的类的开发人员有意义。Init、Load、PreRender、Unload,再加上由嵌入式控件定义的所有回发事件,就构成了向外发送页面的各个阶段标记。执行的各个阶段页面生命周期中的第一个阶段是初始化。这个阶段的标志是Init事件。在成功创建页面的控件树后,将对应用程序触发此事件。换句话说,当Init事件发生时,.aspx源文件中静态声明的所有控件都已实例化并采用各自的默认值。控件可以截取Init事件以初始化在传入的Web请求的生命周期内所需的所有设置。例如,这时控件可以加载外部模板文件或设置事件的处理程序。请注意,这时视图状态信息尚不可用。初始化之后,页面框架将加载页面的视图状态。视图状态是名称/值对的集合,在此集合中,控件和页面本身存储了对所有Web请求都必须始终有效的全部信息。视图状态代表了页面的调用上下文。通常,它包含上次在服务器上处理页面时控件的状态。首次在会话中请求页面时,视图状态为空。默认情况下,视图状态存储在静默添加到页面的隐藏字段中,该字段的名称是__VIEWSTATE。通过覆盖LoadViewState方法(Control类的受保护、可覆盖方法),组件开发人员可以控制视图状态的存储方式以及视图状态的内容映射到内部状态的方式。有些方法(如LoadPageStateFromPersistenceMedium以及其对应的SavePageStateToPersistenceMedium),可以用来将视图状态加载并保存到其他存储介质(例如会话、数据库或服务器端文件)中。与LoadViewState不同,上述方法只能在从Page导出的类中使用。存储视图状态之后,页面树中控件的状态与页面最后一次显示在浏览器中的状态相同。下一步是更新它们的状态以加入客户端的更改。处理回发数据阶段使控件有机会更新其状态,从而准确反映客户端相应的HTML元素的状态。例如,服务器的TextBox控件对应的HTML元素是<inputtype=text>。在回发数据阶段,TextBox控件将检索<input>标记的当前值,并使用该值来刷新自己内部的状态。每个控件都要从回发的数据中提取值并更新自己的部分属性。TextBox控件将更新它的Text属性,而CheckBox控件将刷新它的Checked属性。服务器控件和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

提交评论