在ASP.NET 2.0中,一个ASP.NET页面的生命周期2007-06-08 10:28
在ASP.NET 2.0中,一个ASP.NET页面的生命周期主要为:
[list=1]
  • 客户端请求页面
  • 预初始化(OnPreInit)
  • 初始化(OnInit)
  • 完成初始化(OnInitComplete)
  • 载入ViewState(LoadViewState)
  • 处理回送数据(IPostBackDataHandler)
  • Page_OnPreLoad—》Page_OnLoad
  • 回发更改通知(RaisePostDataChangedEvent)
  • 处理回发事件(RaisePostBackEvent)
  • Page_OnLoadComplete
  • 预呈现(OnPreRender)
  • 完成预呈现(OnPreRenderComplete)
  • 保存ControlState(SaveControlState)
  • 保存ViewState(SaveViewState)
  • 呈现(Render)
  • Page_UnLoad。

    OnPreInit:在初始化页面OnInit事件前触发。在这个阶段里,可以进行定义站点主题(Theme)或加载站点个性化所需要的数据信息等操作。
    OnInitComplete:完成初始化页面OnInit事件后触发。
    OnPreLoad:在加载页面OnLoad事件前触发。
    OnLoadComplete:完成页面加载OnLoad事件后触发。
    OnPreRenderComplete:在完成预呈现OnPreRender事件后触发。这是完成页面呈现的最后一道关卡,在此之后,页面将无法再进行任何呈现上的改动。
    SaveControlState:保存控件状态ControlState。ControlState是ASP.NET2.0控件新增的一个属性,类似ViewState作用,但它们区别在于ControlState用于保存更加重要的控件状态信息,以保证在禁用ViewState的情况下还可以对控件状态进行读写操作。
    增加对页面Header的控制:
    System.Web.UI.Page类新增加了Header属性,用于对HTML页面头区域里数据的操作。通过对Header属性的跟踪,可以发现,Header属性保存着一个实现IPageHeader接口的对象(该对象有LinkedStyleSheets、Metadata、StyleSheet和Title四个属性),实际上正是通过这个对象实现对HTML页面头区域里数据的操作的。
    例如:
    <script runat="server">
    void Page_Load(object sender, System.EventArgs e)
    {
    this.Header.Metadata.Add("author", "brooks");
    }
    </script>
       
    其运行结果为:
    <html>
    <head> <title>Untitled Page</title>
    <meta name="author" content="brooks" />
    </head>
    定义表单中的默认按钮:
    在ASP.NET1.0中,我就为了设置表单中的默认按钮而一筹莫展。幸好ASP.NET2.0把这个功能补上了,现在可以非常方便的设置表单中的默认按钮了。
    <%@ page language="C#" %>
    <script runat="server">
    void Button1_Click(object sender, System.EventArgs e)
    {
    this.LB_Message.Text = "You clicked button1";
    }
    </script>
    <html>
    <head runat="server">
    <title>Untitled Page</title>
    </head>
    <body>
    <form runat="server" defaultbutton="Button1">
    <asp:textbox ></asp:label>
    </form>
    </body>
    </html>
  • ASP.NET
    ASP.NET 页生命周期概述

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

    一般来说,页要经历下表概述的各个阶段。除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页。有关更多信息,请参见 IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

    阶段

    说明

    页请求

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

    开始

    在开始阶段,将设置页属性,如 UICulture 属性。

    页初始化

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

    加载

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

    验证

    在验证期间,将调用所有验证程序控件的 IsValid 属性。

    回发事件处理

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

    呈现

    在呈现之前,会针对该页和所有控件保存视图状态。在呈现阶段中,页会针对每个控件调用 OutputStream 中。

    卸载

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

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

    页还支持自动事件连接,即,ASP.NET 将查找具有特定名称的方法,并在引发了特定事件时自动运行这些方法。如果 ASP.NET Web 服务器控件事件模型

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

    页事件

    典型使用

    PreInit

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

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

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

    • 动态设置主控页。

    • 动态设置 Theme 属性。

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

      asp.net 2.0生命周期说明:

      如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被覆盖。

    Init

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

    InitComplete

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

    PreLoad

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

    Request 实例包括的任何回发数据。

    Load

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

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

    控件事件

    使用这些事件来处理特定控件事件,如 TextChanged 事件。

    asp.net 2.0生命周期说明:

    在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 IsValid 属性。

    LoadComplete

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

    PreRender

    在该事件发生前:

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

    SaveStateComplete

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

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

    Render

    这不是事件;在处理的这个阶段,Render 方法。

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

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

    Unload

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

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

    asp.net 2.0生命周期说明:

    在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。

    各个 ASP.NET 服务器控件都有自己的生命周期,该生命周期与页生命周期类似。例如,控件的 Load 事件在相应的页事件期间发生。

    虽然 Load 事件之前发生(由上到下)。

    可以通过处理控件的事件(如 开发自定义 ASP.NET 服务器控件

    当从 MyBase.Load)以运行基实现。

    添加的控件的追赶事件

    如果控件是在运行时动态创建的,或者是以声明方式在数据绑定控件的模板中创建的,它们的事件最初与页上的其他控件的事件并不同步。例如,对于运行时添加的控件,Controls 集合时所对应事件为止。

    一般来说,除非存在嵌套数据绑定控件,否则,您不必担心这种情况。如果子控件已执行数据绑定,但其容器控件尚未执行数据绑定,则子控件中的数据与其容器控件中的数据可能不同步。如果子控件中的数据根据容器控件中的数据绑定值执行了处理,这种情况则尤其显著。

    例如,假定有一个 SqlDataSource),后者在查询中使用 CompanyID 来检索公司管理者数据。

    如果以声明方式设置了 GridView 控件),因此它们的数据绑定阶段并不同步。

    若要避免此种情况,需要将 ListBox 控件才会绑定到其数据。

    有关更多信息,请参见使用数据源控件绑定到数据

    为了帮助您理解页生命周期与数据绑定事件之间的关系,下表列出了数据绑定控件(如 FormView 控件)中与数据相关的事件。

    控件事件

    典型使用

    DataBinding

    该事件在包含控件(或 PreRender 事件之前由数据绑定控件引发,会标记控件到数据的绑定过程的起点。

    如果需要,使用该事件以手动方式打开数据库连接。(数据源控件通常不需要如此操作。)

    ListView 控件)

    使用该事件来操作不依赖于数据绑定的内容。例如,在运行时,可以以编程方式向 GridView 控件中的页眉或页脚行添加格式。

    ListView 控件)

    当该事件发生时,行或项中的数据可用,因此,可以在子数据源控件上格式化数据或设置 FilterExpression 属性,以便显示行或项中的相关数据。

    DataBound

    该事件在数据绑定控件中标记数据绑定操作的结尾。在 GridView 控件中,会针对所有行和任何子控件完成数据绑定。

    使用该事件格式化数据绑定内容,或在依赖来自当前控件的内容的值的其他控件中启动数据绑定。(有关详细信息,请参见本主题中前面的“添加的控件的追赶事件”。)

    Login 控件事件与页生命周期的关联方式,可以使用下表中列出的事件。

    控件事件

    典型使用

    LoggingIn

    在回发期间,当页的 LoadComplete 事件发生后就会引发该事件。它标记登录过程的起点。

    对必须在验证过程开始前发生的任务使用该事件。

    Authenticate

    该事件在 LoggingIn 事件之后引发。

    使用该事件来覆盖或增强 Login 控件的默认验证行为。

    LoggedIn

    该事件在验证用户名和密码后引发。

    使用该事件来重定向到另一个页或动态设置控件中的文本。如果出现错误或验证失败,就不会发生该事件。

    LoginError

    如果验证失败,将引发该事件。

    使用该事件来设置控件中的问题解释文本或将用户定向到不同的页。

    相关文章: