65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 生命周期概述

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (21投票s)

2013 年 10 月 11 日

CPOL

12分钟阅读

viewsIcon

130681

什么是 ASP.net?ASP.NET 是微软基于 .NET Framework 开发和营销的下一代 Web 应用程序框架。但并非是

什么是 ASP.net?

ASP.NET 是微软基于 .NET Framework 开发和营销的下一代 Web 应用程序框架。但不要将其误认为是 ASP 的升级版本。它于 2002 年 1 月随 .NET Framework 1.0 版本首次发布,是微软 Active Server Pages (ASP) 技术成功的继承者。

ASP.NET 允许程序员构建动态网站、Web 应用程序、Web 服务以及许多强大的功能。ASP.NET 的一个关键特性是它使用事件驱动的编程模型。

它构建在 通用语言运行时 (CLR) 之上,允许程序员使用任何受支持的 .NET 语言编写 ASP.NET 代码。它是一种服务器端脚本技术,允许将脚本(嵌入在网页中)由 Web 服务器(Internet Information Services)执行。在 ASP.NET 中,您不限于脚本语言。您现在可以使用以下 .NET 语言

  • C#
  • J#
  • VB.NET

使用微软的开发工具 Visual Studio,Web 开发人员可以轻松地拖放服务器控件来开发非常引人注目的 ASP.NET 应用程序。微软已发布最新版本。通过采用敏捷实践,并使用 IDE 和 ALM 工具,微软这次能够以一半的里程碑数量完成发布。为 Windows 8 开发出色的应用程序是本次发布的一个重要目标。

它是如何工作的?

您应该熟悉页面生命周期过程,以便正确初始化控件。控件的生命周期基于页面生命周期,并且页面会引发许多您需要在自定义控件中处理的事件。

当 Web 浏览器向 Web 服务器请求页面时,Web 服务器(IIS)会首先检查请求是否为 HTML 页面。如果是,则通过从操作系统中获取文件然后将其返回给客户端(Web 浏览器)来满足请求。如果客户端请求的是 ASP.NET 页面,IIS 会将请求传递给 ASP.NET 运行时,然后 ASP.NET 运行时会通过逐行读取文件并执行文件中的脚本来处理应用程序。处理完成后,它会以纯 HTML 格式将输出返回给客户端。

当 ASP.NET 页面运行时,它会经历一个生命周期,在此期间它会执行一系列处理步骤。这些步骤包括初始化、实例化控件、恢复和维护状态、运行事件处理程序代码以及渲染。理解页面生命周期对您来说很重要,这样您才能在适当的生命周期阶段编写代码以达到预期的效果。
为了记住 Asp.net 的整个页面生命周期过程,请将这个词“SILVER”牢记在心,它的定义是:
S = Start (开始)
I = Initialization (初始化)
L = Load (加载)
V = Validate (验证)
E = Event Handlers (事件处理)
R = Render (渲染)
在“SILVER”之前和之后各有一个步骤需要处理。每个步骤都会被完整定义为:
页面请求
页面请求发生在页面生命周期开始之前。当用户请求页面时,ASP.NET 会确定页面是否需要被解析和编译,或者是否可以发送页面的缓存版本而无需运行页面。
开始
在开始阶段,会设置 Request 和 Response 等页面属性。在此阶段,页面还会确定请求是回发还是新请求,并设置 IsPostBack 属性。页面还会设置 UICulture 属性。
初始化
在页面初始化期间,页面上的控件可用,并且会设置每个控件的 UniqueID 属性。如果适用,还会将母版页和主题应用于页面。如果当前请求是回发,则尚未加载回发数据,并且控件属性值尚未恢复到视图状态中的值。
加载
在加载期间,如果当前请求是回发,则会使用从视图状态和控件状态恢复的信息加载控件属性。
验证和事件处理
如果请求是回发,则会调用控件事件处理程序。之后,会调用所有验证控件的 Validate 方法,该方法会设置各个验证控件和页面的 IsValid 属性。此顺序有一个例外:导致验证的事件的处理程序会在验证之后调用。
渲染
在渲染之前,会保存页面和所有控件的视图状态。在渲染阶段,页面会调用每个控件的 Render 方法,提供一个文本写入器,该写入器将其输出写入页面 Response 属性的 OutputStream 对象。
卸载
在页面完全渲染、发送到客户端并准备好被丢弃后,会引发 Unload 事件。此时,会卸载 Response 和 Request 等页面属性并执行清理。
在页面生命周期的每个阶段,页面都会引发您可以在其中运行自定义代码的事件。对于控件事件,您可以通过声明性地使用 onclick 等属性,或在代码中将事件处理程序绑定到事件。页面还支持自动事件连接,这意味着 ASP.NET 会查找具有特定名称的方法,并在引发某些事件时自动运行这些方法。如果 @ Page 指令的 AutoEventWireup 属性设置为 true,则页面事件会自动绑定到使用 Page_event 命名约定(如 Page_Load 和 Page_Init)的方法。
PreInit
在开始阶段完成后、初始化阶段开始之前引发。请为此事件执行以下操作:
  1. 检查 IsPostBack 属性,以确定这是页面第一次被处理。此时 IsCallback 和 IsCrossPagePostBack 属性也已设置。
  2. 创建或重新创建动态控件。
  3. 动态设置母版页。
  4. 动态设置 Theme 属性。
  5. 读取或设置配置文件属性值。
如果请求是回发,则控件的值尚未从视图状态恢复。如果您在此阶段设置控件属性,则其值可能会在下一个事件中被覆盖。
Init
在所有控件初始化完成并应用了任何皮肤设置后引发。各个控件的 Init 事件发生在页面 Init 事件之前。使用此事件读取或初始化控件属性。
 
InitComplete
在页面初始化阶段结束时引发。Init 和 InitComplete 事件之间只有一个操作:打开视图状态更改的跟踪。视图状态跟踪使控件能够持久化以编程方式添加到 ViewState 集合中的任何值。直到视图状态跟踪打开之前,添加到视图状态的任何值在回发时都会丢失。控件通常在其引发 Init 事件后立即打开视图状态跟踪。使用此事件对视图状态进行更改,以确保在下次回发后这些更改能够得到保留。
 
PreLoad
在页面和所有控件加载视图状态后,以及在处理包含在 Request 实例中的回发数据后引发。
 
Load (加载)
Page 对象调用 Page 对象的 OnLoad 方法,然后递归地对每个子控件执行相同的操作,直到页面和所有控件都加载完成。各个控件的 Load 事件发生在页面 Load 事件之后。使用 OnLoad 事件方法来设置控件属性和建立数据库连接。
 
控制事件
使用这些事件来处理特定的控件事件,例如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。在回发请求中,如果页面包含验证控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。
 
加载完成
在事件处理阶段结束时引发。使用此事件来执行需要页面上所有其他控件都已加载的任务。
 
PreRender
在 Page 对象创建了呈现页面所需的所有控件(包括复合控件的子控件)之后引发。Page 对象在 Page 对象上引发 PreRender 事件,然后递归地对每个子控件执行相同的操作。各个控件的 PreRender 事件发生在页面 PreRender 事件之后。使用此事件在渲染阶段开始之前对页面或其控件的内容进行最终更改。
 
PreRenderComplete
在每个数据绑定控件(其 DataSourceID 属性已设置)调用其 DataBind 方法之后引发。
SaveStateComplete
在页面和所有控件的视图状态和控件状态保存后引发。此时对页面或控件的任何更改都会影响渲染,但这些更改不会在下次回发时被检索。
 
Render
这不是一个事件;相反,在此处理阶段,Page 对象会调用每个控件上的此方法。所有 ASP.NET Web 服务器控件都有一个 Render 方法,该方法将控件的标记输出发送到浏览器。如果您创建自定义控件,通常会重写此方法以输出控件的标记。但是,如果自定义控件仅包含标准的 ASP.NET Web 服务器控件且不包含自定义标记,则无需重写 Render 方法。用户控件会自动包含渲染,因此您无需在代码中显式渲染控件。
 
Unload
为每个控件然后为页面引发。在控件中,使用此事件来执行特定控件的最终清理,例如关闭控件特定的数据库连接。对于页面本身,使用此事件来执行最终清理工作,例如关闭打开的文件和数据库连接,或完成日志记录或其他请求特定的任务。在卸载阶段,页面及其控件已渲染,因此您无法对响应流进行进一步的更改。如果您尝试调用 Response.Write 方法等方法,页面将抛出异常。
单独的 ASP.NET 服务器控件有其自己的生命周期,这与页面生命周期相似。例如,控件的 Init 和 Load 事件发生在相应的页面事件期间。虽然 Init 和 Load 都会递归地发生在每个控件上,但它们的发生顺序是相反的。每个子控件的 Init 事件(以及 Unload 事件)发生在它们的容器的相应事件引发之前(自下而上)。然而,容器的 Load 事件发生在其子控件的 Load 事件之前(自顶向下)。母版页的行为类似于页面上的子控件:母版页的 Init 事件发生在页面 Init 和 Load 事件之前,而母版页的 Load 事件发生在页面 Init 和 Load 事件之后。

如果在运行时动态创建控件,或者在数据绑定控件的模板中声明性地创建控件,则它们的事件最初不会与其他页面上的控件同步。例如,对于在运行时添加的控件,Init 和 Load 事件可能比声明性创建的控件的相同事件在页面生命周期中发生得晚得多。因此,从实例化时起,动态添加的控件和模板中的控件会逐个引发它们的事件,直到它们赶上添加到 Controls 集合的事件。
 
DataBinding
在控件的 PreRender 事件之后引发,该事件发生在页面 PreRender 事件之后。这适用于 DataSourceID 属性已声明性设置的控件。否则,当您调用控件的 DataBind 方法时会发生此事件。此事件标志着将控件绑定到数据的过程的开始。使用此事件手动打开数据库连接(如果需要),并在运行查询之前动态设置参数值。
 
RowCreated (仅GridView) 或
ItemCreated (DataList、DetailsView、SiteMapPath、DataGrid、FormView、Repeater 和 ListView 控件)
在控件的 DataBinding 事件之后引发。使用此事件来处理不依赖于数据绑定的内容。例如,在运行时,您可能会以编程方式向 GridView 控件的标题行或页脚行添加格式。
 
RowDataBound (仅GridView) 或
ItemDataBound (DataList、SiteMapPath、DataGrid、Repeater 和 ListView 控件)
在控件的 RowCreated 或 ItemCreated 事件之后引发。当此事件发生时,数据在行或项中可用,因此您可以格式化数据或为子数据源控件设置 FilterExpression 属性以在行或项中显示相关数据。
 
DataBound
在数据绑定控件的数据绑定操作结束时引发。在 GridView 控件中,所有行的 A 绑定已完成,并且所有子控件也已完成。使用此事件来格式化数据绑定内容或启动依赖于当前控件内容的值的其他控件的数据绑定。
 
Login 控件可以利用 Web.config 文件中的设置自动管理成员身份验证。但是,如果您的应用程序需要自定义控件的工作方式,或者您想了解 Login 控件事件与页面生命周期的关系。
 
LoggingIn
在回发期间引发,在页面 LoadComplete 事件发生之后。此事件标志着登录过程的开始。使用此事件来执行必须在开始身份验证过程之前完成的任务。
  
Authenticate
在 LoggingIn 事件之后引发。使用此事件来覆盖或增强 Login 控件的默认身份验证行为。
  
LoggedIn
 
在用户名和密码经过身份验证之后引发。使用此事件来重定向到另一个页面或动态设置控件中的文本。如果发生错误或身份验证失败,则不会发生此事件。
  
LoginError
 
如果身份验证不成功则引发。使用此事件来设置控件中的文本,解释问题或将用户重定向到另一个页面。
© . All rights reserved.