页生命周期概述,生命周期概述

ASP.NET
页运转时,此页将经历一个生命周期,在生命周期中校实行一层层管理步骤。那几个手续满含初步化、实例化控件、还原和保证状态、运维事件管理程序代码以及开始展览显示。掌握页生命周期特别关键,因为那样做你就会在生命周期的适宜阶段编写代码,以达成预期效应。此外,如若你要开垦自定义控件,就无法面生页生命周期,以便科学举行控件开头化,使用视图状态数据填充控件属性以及运维任何控件行为代码。(控件的生命周期基于页的生命周期,然而页引发的控件事件比单独的
ASP.NET 页中可用的风浪多。)

ASP.NET
页运营时,此页将经历三个生命周期,在生命周期元帅实践一各个管理步骤。那一个手续包罗开首化、实例化控件、还原和掩护状态、运维事件管理程序代码以及进行显示。领悟页生命周期非常首要,因为那样做你就能够在生命周期的适度阶段编写代码,以完毕预期效应。其它,假使您要花费自定义控件,就亟须熟练页生命周期,以便精确进行控件起始化,使用视图状态数据填充控件属性以及运行任何控件行为代码。(控件的生命周期基于页的生命周期,但是页引发的控件事件比单独的
ASP.NET 页中可用的风浪多。)

常规页生命周期阶段

诚如的话,页要经历下表概述的依次阶段。除了页生命周期阶段以外,在呼吁前后还留存应用程序阶段,可是这么些等第并不特定于页。有关越多消息,请参见
ASP.NET
应用程序生命周期概述
.aspx)。

 

阶段 说明

页请求

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

开始

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

页初始化

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

加载

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

验证

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

回发事件处理

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

呈现

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

卸载

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

常规页生命周期阶段

一般的话,页要经历下表概述的相继阶段。除了页生命周期阶段以外,在央浼前后还存在应用程序阶段,可是那个品级并不特定于页。有关越来越多音讯,请参见ASP.NET
应用程序生命周期概述

阶段 说明

页请求

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

开始

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

页初始化

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

加载

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

验证

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

回发事件处理

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

呈现

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

卸载

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

生命周期事件

在页生命周期的每一种阶段中,页将掀起可运营您本人的代码举办管理的平地风波。对于控件事件,通过以宣称方式使用性质(如
onclick)或以使用代码的方式,均可将事件管理程序绑定到事件。

页还支持电动事件三翻五次,即,ASP.NET
将搜索具有一定称谓的法门,并在掀起了特定事件时自动运转这几个主意。假设 @
Page
.aspx)
指令的 AutoEventWireup 属性设置为
true(可能未定义该属性,因为该属性默感到
true),页事件将活动绑定至选拔 Page_*事件*的命名约定的秘籍(如
Page_LoadPage_Init)。有关机关事件三番两回的越来越多音信,请参见
ASP.NET Web
服务器控件事件模型
.aspx)。

下表列出了最常用的页生命周期事件。除了列出的风云外还会有任何事件;不过,大许多页管理方案不利用这一个事件。而是重视由
ASP.NET 网页上的服务器控件使用,以开首化和表现它们自个儿。假诺要编写制定本人的
ASP.NET
服务器控件,则需求详细询问那么些等第。有关创立自定义控件的新闻,请参见支付自定义
ASP.NET
服务器控件
.aspx)。

 

页事件 典型使用

PreInit

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

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

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

  • 动态设置主控页。

  • 动态设置 Theme 属性。

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

    注意

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

Init

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

InitComplete

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

PreLoad

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

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

Load

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

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

控件事件

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

注意

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

LoadComplete

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

PreRender

在该事件发生前:

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

SaveStateComplete

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

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

Render

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

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

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

Unload

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

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

注意

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

生命周期事件

在页生命周期的每种阶段中,页将掀起可运行您自个儿的代码实行管理的平地风波。对于控件事件,通过以宣称格局使用性质(如 onclick)或以使用代码的点子,均可将事件处理程序绑定到事件。

页还协助电动事件三翻五次,即,ASP.NET
将寻觅具有特定称谓的艺术,并在诱惑了一定事件时自动运营那几个办法。即使 @ Page 指令的 AutoEventWireup 属性设置为 true(也许未定义该属性,因为该属性默以为 true),页事件将自动绑定至选取 Page_*事件*的命名约定的艺术(如 Page_Load 和 Page_Init)。有关活动事件三翻五次的更加的多音讯,请参见 ASP.NET
Web
服务器控件事件模型

下表列出了最常用的页生命周期事件。除了列出的事件外还会有其他交事务件;不过,大多数页处理方案不应用这几个事件。而是器重由
ASP.NET 网页上的服务器控件使用,以开头化和显现它们自个儿。要是要编写本人的
ASP.NET
服务器控件,则须求详细明白这几个等第。有关成立自定义控件的音信,请参见开荒自定义
ASP.NET
服务器控件

页事件 典型使用

PreInit

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

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

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

  • 动态设置主控页。

  • 动态设置 Theme 属性。

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

    注意

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

Init

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

InitComplete

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

PreLoad

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

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

Load

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

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

控件事件

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

注意

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

LoadComplete

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

PreRender

在该事件发生前:

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

SaveStateComplete

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

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

Render

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

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

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

Unload

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

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

注意

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

任何的页生命周期注意事项

逐个 ASP.NET
服务器控件都有友好的生命周期,该生命周期与页生命周期类似。比如,控件的
InitLoad 事件在相应的页事件时期发生。

虽然 InitLoad
都在每一个控件上以递归情势发生,但它们的爆发顺序相反。每一种子控件的
Init 事件(还有 Unload
事件)在为其容器引发相应的风浪此前产生(由下到上)。不过,容器的
Load 事件是在其子控件的 Load 事件在此之前产生(由上到下)。

能够因而处理控件的事件(如 Button 控件的 Click 事件和
ListBox.aspx)
控件的
SelectedIndexChanged.aspx)
事件)来自定义控件的外观或内容。在某个情状下,或者也需管理控件的
DataBinding.aspx)

DataBound.aspx)
事件。有关愈来愈多信息,请参见各样控件的类参谋主旨以及付出自定义 ASP.NET
服务器控件
.aspx)。

当从 Page
类承袭类时,除了能够拍卖由页引发的事件以外,还是能重写页的基类中的方法。比方,能够重写页的
InitializeCulture.aspx)
方法,以便动态设置区域性音信。注意,在选取
Page_*事件*语法成立事件管理程序时,将隐式调用基完毕,因而没有须求在点子中调用它。举个例子,无论是不是创制
Page_Load 方法,始终都会调用页基类的 OnLoad
方法。可是,借使选拔 override 关键字(在 Visual Basic 中为
Overrides)重写页的 OnLoad
方法,则必须显式调用基方法。比方,假若在页中重写 OnLoad
方法,则必须调用 base.Load(在 Visual Basic 中为
MyBase.Load)以运维基完毕。

其他的页生命周期注意事项

逐一 ASP.NET
服务器控件都有和煦的生命周期,该生命周期与页生命周期类似。比方,控件的 Init 和 Load 事件在相应的页事件时期发生。

虽然 Init 和 Load 都在每一种控件上以递归方式爆发,但它们的发生顺序相反。各类子控件的 Init 事件(还有 Unload 事件)在为其容器引发相应的风浪在此之前发生(由下到上)。不过,容器的 Load 事件是在其子控件的 Load 事件在此之前发生(由上到下)。

能够经过管理控件的事件(如 Button 控件的 Click 事件和 ListBox 控件的 SelectedIndexChanged 事件)来自定义控件的外观或内容。在一些情形下,恐怕也需管理控件的 DataBinding 或 DataBound 事件。有关更加多信息,请参见种种控件的类参照他事他说加以考察主旨以及支付自定义
ASP.NET
服务器控件

当从 Page 类承袭类时,除了能够处理由页引发的轩然大波以外,还能重写页的基类中的方法。譬如,能够重写页的 InitializeCulture 方法,以便动态设置区域性信息。注意,在应用 Page_*事件*语法创制事件处理程序时,将隐式调用基达成,因而不须求在措施中调用它。比方,无论是还是不是创制 Page_Load 方法,始终都会调用页基类的 OnLoad 方法。不过,假使运用 override 关键字(在
Visual Basic
中为 Overrides)重写页的 OnLoad 方法,则必须显式调用基方法。举个例子,倘若在页中重写 OnLoad 方法,则必须调用 base.Load(在
Visual Basic 中为 MyBase.Load)以运维基达成。

累加的控件的追赶事件

假使控件是在运转时动态创设的,或然是以宣称形式在多少绑定控件的模版中开创的,它们的事件最初与页上的别样控件的风云并不一齐。譬如,对于运维时加上的控件,Init
Load
事件在页生命周期中的发生时间恐怕要比以宣称格局开创的控件的均等事件晚得多。由此,从实例化那一刻起,动态增进的控件的事件就间接是在模板中的控件的风云之后爆发,直到遇见该控件参与
Controls.aspx)
群集时所对应事件截止。

一般的话,除非存在嵌套数据绑定控件,不然,您不要思量这种景色。要是实控件已进行多少绑定,但其容器控件尚未实行多少绑定,则子控件中的数据与其容器控件中的数据或许分歧步。假如实控件中的数据依靠容器控件中的数据绑定值施行了管理,这种情景则更为分明。

比方,假定有二个
GridView.aspx),它的每一行显示一条公司记录,另外,有多少个
ListBox 控件满含集团理事列表。若要填充管理者列表,则需求将
ListBox 控件绑定到贰个数据源控件(如
SqlDataSource.aspx)),前面一个在查询中运用
CompanyID 来检索集团COO数据。

万一以宣称方式设置了 ListBox 控件的多寡绑定属性(如
DataSourceID.aspx)

DataMember.aspx)),ListBox
控件将尝试在含蓄行的 DataBinding 事件时期绑定到其数据源。可是,行的
CompanyID 字段直到 GridView 控件的
RowDataBound.aspx)
事件爆发后才含有值。这种处境下,先绑定子控件(ListBox
控件),后绑定满含控件(GridView
控件),因而它们的多寡绑定阶段并分化台。

若要防止此种情形,须要将 ListBox 控件的数据源控件与 ListBox
控件本人放在同样模板项中,并且永不以宣称方式设置 ListBox
的数目绑定属性。而应在 RowDataBound
事件时期在运营时以编制程序格局设置它们,那样,到 CompanyID 新闻可用时
ListBox 控件才会绑定到其数额。

关于越来越多消息,请参见采取数据源控件绑定到数量.aspx)。

丰盛的控件的追逐事件

倘使控件是在运作时动态创设的,或许是以宣称情势在数码绑定控件的模板中创立的,它们的风浪最初与页上的别的控件的平地风波并不一齐。比如,对于运营时增加的控件,Init 和 Load 事件在页生命周期中的产生时间也许要比以宣称方式开创的控件的一样事件晚得多。由此,从实例化那一刻起,动态增进的控件的风云就径直是在模板中的控件的平地风波之后发出,直到境遇该控件参预 Controls 会集时所对应事件甘休。

一般的话,除非存在嵌套数据绑定控件,不然,您不要挂念这种景色。如若实控件已实施多少绑定,但其容器控件尚未推行多少绑定,则子控件中的数据与其容器控件中的数据大概区别步。假若实控件中的数据依靠容器控件中的数据绑定值推行了拍卖,这种情景则进一步引人瞩目。

举个例子,假定有贰个 GridView,它的每一行呈现一条公司记录,其余,有叁个 ListBox 控件包涵集团决策者列表。若要填充管理者列表,则必要将 ListBox 控件绑定到三个数据源控件(如 SqlDataSource),后面一个在查询中央银行使
CompanyID 来检索公司CEO数据。

只要以宣称形式设置了 ListBox 控件的数额绑定属性(如 DataSourceID 和 DataMember),ListBox 控件将尝试在含有行的 DataBinding 事件时期绑定到其数据源。不过,行的
CompanyID
字段直到 GridView 控件的 RowDataBound 事件发生后才含有值。这种情况下,先绑定子控件(ListBox 控件),后绑定满含控件(GridView 控件),由此它们的数码绑定阶段并不一同。

若要制止此种境况,要求将 ListBox 控件的数据源控件与 ListBox 控件自个儿放在同等模板项中,并且毫不以宣称格局设置 ListBox 的数据绑定属性。而应在RowDataBound 事件时期在运行时以编制程序格局设置它们,那样,到
CompanyID 音讯可用时 ListBox 控件才会绑定到其数量。

至于愈来愈多音讯,请参见行使数据源控件绑定到数量

数量绑定控件的数据绑定事件

为了帮助你理解页生命周期与数码绑定事件之间的关联,下表列出了多少绑定控件(如
GridViewDetailsView.aspx)

FormView.aspx)
控件)中与数据有关的平地风波。

 

控件事件 典型使用

DataBinding

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

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

RowCreated(仅限 GridView)或 ItemCreatedDataListDetailsViewSiteMapPathDataGridFormViewRepeater 控件)

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

RowDataBound(仅限 GridView)或 ItemDataBoundDataListSiteMapPathDataGridRepeater 控件)

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

DataBound

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

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

数据绑定控件的数额绑定事件

为了扶持你精通页生命周期与数码绑定事件之间的涉嫌,下表列出了数额绑定控件(如 GridViewDetailsView 和 FormView 控件)中与数据相关的平地风波。

控件事件 典型使用

DataBinding

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

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

RowCreated(仅限 GridView)或ItemCreatedDataListDetailsViewSiteMapPathDataGridFormView 和Repeater 控件)

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

RowDataBound(仅限 GridView)或ItemDataBoundDataListSiteMapPathDataGrid 和 Repeater 控件)

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

DataBound

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

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

报到控件事件

Login.aspx)
控件能够使用 Web.config
文件中的设置来机关处理成员身份认证。可是,假如应用程序要求您自定义控件的劳作措施,恐怕你要精通
Login 控件事件与页生命周期的关系格局,能够动用下表中列出的事件。

 

控件事件 典型使用

LoggingIn

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

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

Authenticate

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

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

LoggedIn

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

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

LoginError

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

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

摘自msdn,原文地址:http://msdn.microsoft.com/zh-cn/library/ms178472(VS.80).aspx

相关文章