zoukankan      html  css  js  c++  java
  • 步步为营 C# 技术漫谈 二、ASP.NET 页生命周期

    常规页生命周期阶段


    一般来说,页要经历下表概述的各个阶段。除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页。

    阶段

    说明

    页请求

    页请求发生在页生命周期开始之前。用户请求页时,ASP.NET 将确定是否需要分析和编译页(从而开始页的生命周期),或者是否可以在不运行页的情况下发送页的缓存版本以进行响应。

    开始

    在开始阶段,将设置页属性,如 Request 和 Response。在此阶段,页还将确定请求是回发请求还是新请求,并设置 IsPostBack 属性。此外,在开始阶段期间,还将设置页的 UICulture 属性。

    页初始化

    页初始化期间,可以使用页中的控件,并将设置每个控件的 UniqueID 属性。此外,任何主题都将应用于页。如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。

    加载

    加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。

    验证

    在验证期间,将调用所有验证程序控件的 Validate 方法,此方法将设置各个验证程序控件和页的 IsValid 属性。

    回发事件处理

    如果请求是回发请求,则将调用所有事件处理程序。

    呈现

    在呈现之前,会针对该页和所有控件保存视图状态。在呈现阶段中,页会针对每个控件调用 Render 方法,它会提供一个文本编写器,用于将控件的输出写入页的 Response 属性的 OutputStream 中。

    卸载

    完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。此时,将卸载页属性(如 Response 和 Request)并执行清理。

    生命周期事件


    在页生命周期的每个阶段中,页将引发可运行您自己的代码进行处理的事件。对于控件事件,通过以声明方式使用属性(如 onclick)或以使用代码的方式,均可将事件处理程序绑定到事件。

    页 还支持自动事件连接,即,ASP.NET 将查找具有特定名称的方法,并在引发了特定事件时自动运行这些方法。如果 @ Page 指令的 AutoEventWireup 属性设置为 true(或者未定义该属性,因为该属性默认为 true),页事件将自动绑定至使用 Page_事件的命名约定的方法(如 Page_Load 和 Page_Init)。

    下表列出了最常用的页生命周期事件。除了列出的事件外还有其他事件;不过,大多数页处理方案不使用这些事件。而是主要由 ASP.NET 网页上的服务器控件使用,以初始化和呈现它们本身。如果要编写自己的 ASP.NET 服务器控件,则需要详细了解这些阶段。

    页事件

    典型使用

    PreInit

    使用该事件来执行下列操作:

    · 检查 IsPostBack 属性来确定是不是第一次处理该页。

    · 创建或重新创建动态控件。

    · 动态设置主控页。

    · 动态设置 Theme 属性。

    · 读取或设置配置文件属性值。

    Init

    在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。

    InitComplete

    由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。

    PreLoad

    如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。

    在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。

    Load

    Page 在 Page 上调用 OnLoad 事件方法,然后以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。

    使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。

    控件事件

    使用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。

    LoadComplete

    对需要加载页上的所有其他控件的任务使用该事件。

    PreRender

    在该事件发生前:

    · Page 对象会针对每个控件和页调用 EnsureChildControls。

    · 设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息,请参见本主题后面的数据绑定控件的数据绑定事件。

    页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。

    SaveStateComplete

    在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。

    使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。

    Render

    这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。

    如果创建自定义控件,通常要覆盖此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要覆盖 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件。

    用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。

    Unload

    该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。

    对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。

    页面经历了如下阶段【其中一些阶段标记为仅仅回传,是说只有在被回传到服务器时,页面才经历这些阶段】:

    alt


     
    01:页面首先从QueryString或者Request对象的Form集合中获得回传数据。


    02: 页面检测回传数据集合(NameValueCollection,Form或者QueryString)是否包含一个键为_CallBackId的项。如 果存在,那么设置其Boolean属性IsCallBack为True,以便通过AspNet客户端回调机制,标明页面已经回传到服务器。


    03:预初始化(PreInit):

      在页面生命周期的预初始化阶段执行如下操作:
    a:调用OnPreInit方法引发PreInit事件。
    b:利用App_Themes目录中的内容初始化主题,以动态实现一个PageTheme类型的类,
    编译该类,并创建一个编译类的实例,接着将实例赋值给它的PageTheme属性值
    c:应用母版页


     04:初始化(Init):
    在页面生命周期的初始化阶段执行以下操作
    a:递归初始化Controls集合中的控件。初始化包括设置这些控件的属性,
    例如:Page,Id和NameContainer等
    b:递归应用控件皮肤
    c:调用OnInit方法以引发自身的Init事件,接着递归调用子控件的OnInit方法来引发它们的Init事件
    d:调用自身的TrackViewState方法来启动自身的视图状态跟踪,接着递归调用子控件
    的TrackViewState方法来启动它们的视图状态跟踪。


    05:完成初始化(InitComplete):
    页面调用OnInitComplete方法来引发InitComplete事件。该事件标明了初始化阶段的结束。
    此时,页面Controls集合的所有控件都被初始化了。
     
    06:加载控件状态(Load Control State)[PostBack Only]:
    页面递归调用Control集合中控件的LoadControlState方法,这些控件已经调用了Page类
    的RegisterRequiresControlState方法,以使用它们的控件状态。
     

    07:加载视图状态(Load View State)[PostBack Only]:
    页面首先调用自身的LoadViewState方法,接着递归调用Controls集合控件的LoadViewState方法,以允许它们加载它们的已经保存的视图状态。
     

    08:加载回传数据(Load Post Data)[PostBack Only]:
    页面调用实现IPostBackDataHandler接口的控件的LoadPostData方法,并将回传数据传递给该方法。每个控件的LoadPostDate方法都必须访问回传数据,并据此更新相应的控件属性。
    例如:TextBox控件的LoadPostData方法将文本框的新值设置为TextBox控件的Text属性值。
     

    09:预加载(PreLoad):
    页面调用OnPreLoad方法以引发PreLoad事件。该事件表示页面生命周期将进入加载阶段。
     

    10:加载(Load):
    页面首先调用自身的OnLoad方法以引发自身的Load事件,接着递归调用Controls集合中控件的OnLoad方法以引发它们的Load事件。页面开发人员可以为Load事件注册回调,那么就可以通过编程将子控件添加到页面的Controls集合中。
     

    11:加载回传数据(Load Post Data)[PostBack Only Second Try]:
    页面调用控件的LoadPostBack方法。这些控件如果实现了IPostBackDataHandler接口,那么在加载阶段,它们已通过编程添加到Controls集合中。
     

    12:引发回传数据修改事件(Raise Post Data Changed Event)[PostBack Only]:
    页面调用控件的RaisePostDataChangeEvent方法,这些控件的LoadPostData方法返回true。
    RaisePostDataChangeEvent方法引发了回传数据修改事件。例如:当文本框的新值与旧值
    不同时,那么TextBox控件将引发该事件。
     

    13:引发回传事件(Raise PostBack Event)[PostBack Only]:
    页面调用控件的RaisePostEvent方法,这些控件相关的Html元素用于提交表单。例如,Button控件的相关Html元素将页面回传到服务 器。控件的RaisePostBackEvent方法必须将回传事件映射到一个或多个服务器事件。例如,Button控件的 RaisePostBackEvent方法将事件映射到了服务器端事件Command和Click上。
     

    14:完成加载(Load Complete):
    页面调用OnLoadComplete方法来引发LoadComplete事件,这表示所有加载活动,包括加载回传数据,以及引发回传数据修改事件,并以更新控件自身的活动都完成了。
     

    15:引发回调事件(Raise CallBack Event)(PostBack And CallBack Only):
    页面调用控件的RaiseCallBackEvent方法。该控件可使用AspNet客户端回调机制来允许客户端方法(例如JavaScript函数)调用服务器端方法,而无需将整个页面回传给服务器。
    RaiseCallBackEvent方法必须调用服务器端方法。如果页面的回传使用了客户端回调机制,那么页面将不会执行剩余的页面生命周期阶段。
     

    16:预呈现(PreRender):
    在页面生命周期这个阶段执行一下操作。
    a:调用EnsureChildControls方法来确保在页面进入呈现阶段之前,创建其子控件。
    b:调用自身的OnPreRender方法来引发PreRender事件。
    c:递归调用Controls集合中控件的OnPreRender方法,以引发它们的PreRender事件。
     

    17:预呈现完成(PreRender Complete):
    页面调用OnPrerenderComplete方法来引发PreRenderComplete事件,这表示所有预呈现活动完成了。
     

    18:保存控件状态(Save Control State):
    页面递归调用Controls集合中控件的SaveControlState方法。这些控件已经调用了Page类的RegisterRequiresControlState方法来保存它们的控件状态。
     

    19:保存视图状态(Save View State):
    页面首先调用自身的SaveViewState方法,然后调用Controls集合中的SaveViewState方法,以允许它们来保存其视图状态。
     

    20:保存状态完成(Save View Complete):
    页面调用OnSaveStateComplete方法以引发SaveStateComplete事件,这表示所有状态保存活动都完成了。
     

    21:呈现:
    在页面生命周期的这个阶段执行一下操作。
    a:创建一个HtmlTextWriter类实例,该实例封装了输出响应流
    b:调用RenderCOntrol方法,并将HtmlTextWriter实例传递给该方法。
    RenderControl方法递归调用子控件的RenderControl方法,以便允许每个控件能够呈现其
    Html标记文本。子控件的Html标记文本组成了最终发送给客户端浏览器的Html标记文本。

     

    22:卸载(unload):

    该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。

    对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。

    步步为营 C# 技术漫谈系列

    步步为营 C# 技术漫谈 一、反射机制

    作者:spring yang

    出处:http://www.cnblogs.com/springyangwc/

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    boost::asio在VS2008下的编译错误
    Java集合框架——接口
    ACM POJ 3981 字符串替换(简单题)
    ACM HDU 1042 N!(高精度计算阶乘)
    OneTwoThree (Uva)
    ACM POJ 3979 分数加减法(水题)
    ACM HDU 4004 The Frog's Games(2011ACM大连赛区第四题)
    Hexadecimal View (2011ACM亚洲大连赛区现场赛D题)
    ACM HDU 4002 Find the maximum(2011年大连赛区网络赛第二题)
    ACM HDU 4001 To Miss Our Children Time (2011ACM大连赛区网络赛)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2075981.html
Copyright © 2011-2022 走看看