Asp.net 简明教程

ASP.NET - Life Cycle

ASP.NET 生命周期指定了如何:

  1. ASP.NET 处理页面以生成动态输出

  2. 实例化并处理应用程序及其页面

  3. ASP.NET 动态编译页面

ASP.NET 生命周期可分为两组:

  1. Application Life Cycle

  2. Page Life Cycle

ASP.NET Application Life Cycle

应用程序生命周期包括以下阶段:

  1. 用户发出访问应用程序资源(即页面)的请求。浏览器会将此请求发送至 Web 服务器。

  2. 统一管道接收到第一个请求,并且发生以下事件:创建类 ApplicationManager 的对象。创建一个 HostingEnvironment 类的对象,以提供有关资源的信息。编译应用程序中的顶级项。

  3. 创建响应对象。创建应用程序对象,例如 HttpContext、HttpRequest 和 HttpResponse,并对其进行初始化。

  4. 创建 HttpApplication 对象的实例并将其分配给请求。

  5. HttpApplication 类处理请求。此类触发不同的事件以处理请求。

ASP.NET Page Life Cycle

当请求页面时,将会将其加载到服务器内存中,处理并发送至浏览器。然后,将其从内存中卸载。在每一步中,都可以使用可根据应用程序的需要进行覆盖的方法和事件。换句话说,可以编写自己的代码来覆盖默认代码。

Page 类创建页面上所有控件的分层树。页面上的所有组件(指令除外)都是此控件树的一部分。可以通过向页面指令中添加 trace= "true" 来查看控件树。我们将在“指令”和“事件处理”下介绍页面指令和跟踪。

页面的生命周期阶段包括:

  1. Initialization

  2. 页面上控件的实例化

  3. 状态的恢复和维护

  4. 事件处理程序代码执行

  5. Page rendering

理解页面周期有助于编写代码,以便在页面生命周期的任何阶段发生特定事务。它还有助于编写定制控件并在正确的时间初始化它们,使用视图状态数据填充其属性,并运行控件行为代码。

以下是 ASP.NET 页面的不同阶段:

  1. Page request - 当 ASP.NET 收到页面请求时,它会决定是解析和编译页面还是使用页面的缓存版本,并据此发送响应。

  2. Starting of page life cycle - 在此阶段,会设置请求和响应对象。如果请求是旧请求或回发,则会将页面的 IsPostBack 属性设置为真。还会设置页面的 UICulture 属性。

  3. Page initialization - 在此阶段,通过设置 UniqueID 属性,为页面上的控件分配唯一 ID,并应用主题。对于新请求,将加载回发数据,并将控件属性还原为视图状态值。

  4. Page load - 在此阶段,使用视图状态和控件状态值设置控件属性。

  5. Validation - 将调用验证控件的 Validate 方法,在方法成功执行后,将页面的 IsValid 属性设置为真。

  6. Postback event handling - 如果请求是回发(旧请求),则会调用相关的事件处理程序。

  7. Page rendering - 在此阶段,将保存页面和所有控件的视图状态。页面将为每个控件调用 Render 方法,并且渲染输出将写入页面响应属性的 OutputStream 类。

  8. Unload - 将渲染后的页面发给客户端,并且会卸载页面属性(如响应和请求),并完成所有清理。

ASP.NET Page Life Cycle Events

在页面生命周期的每个阶段,页面都会触发某些可编码的事件。事件处理程序基本上是绑定到事件的函数或子例程,使用声明式属性(如 Onclick 或 handle)进行绑定。

以下是页面生命周期事件:

  1. PreInit - PreInit 是页面生命周期中的第一个事件。它将检查 IsPostBack 属性,并确定该页面是否是回发。它将设置主题和母版页,创建动态控件,并获取和设置配置文件属性值。可以通过重载 OnPreInit 方法或创建 Page_PreInit 处理程序来处理此事件。

  2. Init - Init 事件将初始化控件属性,并构建控件树。可以通过重载 OnInit 方法或创建 Page_Init 处理程序来处理此事件。

  3. InitComplete - InitComplete 事件允许跟踪视图状态。所有控件都会开启视图状态跟踪。

  4. LoadViewState - LoadViewState 事件允许将视图状态信息加载到控件中。

  5. LoadPostData - 在此阶段,将使用 <form> 标记定义所有输入字段的内容进行处理。

  6. PreLoad - PreLoad 会在回发数据加载到控件中之前发生。可以通过重载 OnPreLoad 方法或创建 Page_PreLoad 处理程序来处理此事件。

  7. Load - 首先,Load 事件会被触发,然后递归触发所有子控件的该事件。控件树中的控件会创建。这个事件可以通过重载 OnLoad 方法或创建 Page_Load 处理器来处理。

  8. LoadComplete - 加载过程将完成,控件事件处理程序将运行,页面验证也将进行。这个事件可以通过重载 OnLoadComplete 方法或创建 Page_LoadComplete 处理器来处理。

  9. PreRender - 在输出渲染之前,将发生 PreRender 事件。通过处理这个事件,页面和控件可以在输出渲染之前执行任何更新。

  10. PreRenderComplete - 由于 PreRender 事件会递归触发所有子控件,这个事件将确保预渲染阶段完成。

  11. SaveStateComplete - 页面上的控件状态将保存下来。个性化设置、控件状态和视图状态信息将保存。HTML 标记将生成出来。可以通过重写 Render 方法或创建 Page_Render 处理器来处理这个阶段。

  12. UnLoad - UnLoad 阶段是页面生命周期的最后一个阶段。它会递归触发所有控件的 UnLoad 事件,最后触发页面的该事件。将进行最后的清理,所有资源和引用(例如数据库连接)将释放。这个事件可以通过修改 OnUnLoad 方法或创建 Page_UnLoad 处理器来处理。