客户发出POST请求-〉
创建Page派生类,调用构造函数-〉
调用Page类的IHttpHandler.ProcessRequest方法-〉
激活Page类的Init事件-〉调用Page类的CreateChildControls虚方法-〉
从POST变量和VIEWSTATE中还原服务器端控件状态-〉
激活Page类的Load事件-〉
激活服务器端控件事件-〉
激活Page类的PreRender事件-〉
调用Page类的Render虚方法-〉
调用Page类的RenderChildren虚方法-〉
发送HTTP响应给客户端-〉
激活Page类的Unload事件-〉
丢弃Page派生类的实例。
Page_Init()
LoadViewState
LoadPostData
Page_Load()
RaisePostDataChanged
RaisePostBackEvent
Page_PreRender()
SaveViewState
Page_Render()
UnLoad
详细
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class _Default : Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
#region OnPreInit 第一步
protected override void OnPreInit(EventArgs e)
{
//检查 IsPostBack 属性来确定是不是第一次处理该页。
//创建或重新创建动态控件。
//动态设置主控页。
//动态设置 Theme 属性。
//读取或设置配置文件属性值。
//注意
//如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被重写。
base.OnPreInit(e);
}
#endregion
#region OnInit 第二步
protected override void OnInit(EventArgs e)
{
//在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。
base.OnInit(e);
}
#endregion
#region OnInitComplete 第三步
protected override void OnInitComplete(EventArgs e)
{
//由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。
base.OnInitComplete(e);
}
#endregion
#region PreLoad 第四步
protected override void OnPreLoad(EventArgs e)
{
//如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。
//在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。
base.OnPreLoad(e);
}
#endregion
#region OnLoad 第五步
protected override void OnLoad(EventArgs e)
{
//Page 在 Page 上调用 OnLoad 事件方法,然后以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。
//使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。
base.OnLoad(e);
}
#endregion
#region 控件事件 第六步
protected void Button1_Click(object sender, EventArgs e)
{
//用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。
//注意
//在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。
}
#endregion
#region OnLoadComplete 第七步
protected override void OnLoadComplete(EventArgs e)
{
//对需要加载页上的所有其他控件的任务使用该事件。
base.OnLoadComplete(e);
}
#endregion
#region OnPreRender 第八步
protected override void OnPreRender(EventArgs e)
{
//在该事件发生前:
//Page 对象会针对每个控件和页调用 EnsureChildControls。
//设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息,请参见下面的数据绑定控件的数据绑定事件。
//页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。
base.OnPreRender(e);
}
#endregion
#region SaveStateComplete 第九步
protected override void OnSaveStateComplete(EventArgs e)
{
//在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。
//使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。
base.OnSaveStateComplete(e);
}
#endregion
#region Render 第十步
//Render
//这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。
//如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件。
//用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。
#endregion
#region OnUnload 第十一步
protected override void OnUnload(EventArgs e)
{
//该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。
//对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。
//注意
//在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。
base.OnUnload(e);
}
#endregion
}
当一个页面请求被发送到WEB服务器,不论该事件是由页面提交还是由页面重定向而激发的,页面在其被创建到释放的过程中都会运行一系列的事件。当我们创建ASP.NET页的时候往往没有关注它的执行周期,从而让我们碰到很多让自己头疼的问题。但是,如果被正确的使用和操纵,页生命周期会成为一个高效且强大的工具。很多开发者都认识到,理解页面执行过程中发生了什么和什么时候发生对高效编写ASP.NET页和用户控件是十分关键的。那么,让我们来详细的了解一个ASP.NET页面从被创建到其被释放的过程中的十个事件。 我将把这个过程建立在一个用C#编写的ASP.NET简单提交页上。这个页面首次会加载一些服务器端WEB控件,当WEB服务器接收到它的请求时,WEB服务器就会处理我们的WEB控件并最终让我们得到该页的HTML呈现。处理页面的第一步是对象初始化。
1.对象初始化
页面中的控件(包括页面本身)都是在它们最初的FORM中被首次初始化的。通过在ASPX页面的后台代码文件的构造器中声明你的对象,页面将知道对象的类型,并知道需要创建多少个这样的对象。一旦你在构造器中声明了你的控件,你就可以在它的任何子类,方法,事件或者属性中访问到它们。但是,如果你的任何对象是在ASPX文件中指定的控件,这样的控件是没有属性的。而且这样做对从代码中访问它们是危险的,因为无法保证这些控件实例是按照怎样的顺序被创建的(假定它们都是能完全被创建的)。初始化事件可以通过OnInit方法重载。
2.加载视图状态数据
初始化以后,控件仅能通过ID引用(还没有建立用于相对引用的文档对象模型)。 在LoadViewState事件中,已初始化的控件获得第一个属性:上一次提交存留到服务器的视图状态信息。页视图状态通过ASP.NET维护,它被用于在一个往返行程中存留信息到服务器。视图状态信息被保存为一个名称/值对,它包含控件的如Text和Value一类的信息。视图信息被保存在隐藏<input>控件的值属性中在页请求中传递。正如你所了解的,这是旧的ASP3.0状态维护技术的一个巨大飞跃。这个事件可以通过LoadViewState方法重载,往往用来在控件被填充时定制它所接受的数据。
图2显示了一个在LoadViewState事件中设置视图状态的重载例子。
3.LoadPostData处理回传数据
在创建页的阶段,被发送到服务器端的Form数据(ASP.NET中的术语为回传数据)依照每个控件的数据需求进行处理。当页面提交Form时,框架将在每个提交数据的控件上实现IPostBackDataHandler接口。页面然后激发LoadPostData事件,通过页面解析发现实现了IPostBackDataHandler接口的控件,并用正确的回传数据更新控件状态。ASP.NET通过匹配控件的唯一标示符来更新正确的控件,该标示符具有名称值集合中的名称值
对。这也就是在所有特定的页中每个控件都需要一个唯一标示符的原因之一。其它的步骤都由框架来完成,以确定每个标示符在环境中是唯一的,例如存在于单页面中的自定义用户控件。LoadPostData事件被激发后,RaisePostDataChanged事件就可以随时被执行了(请继续往下看)
4.对象加载
对象在Load事件中获得正确的Form。所有的对象首先都被组织在页DOM(ASP.NET中称为控件树)中,并且很容易通过代码或者相对位置(crawling the DOM)来引用。然后对象就可以自由的访问HTML中的客户端属性集,例如width,value,或者visibility。加载时,控件逻辑,如算法、以编程方式设置控件属性、用StringBuilder装配输出字符串都同时被执行。大部分的工作都是在这一阶段完成的。Load 事件能够通过调用OnLoad
来重载,如图3。
5.激发RaisePostDataChanged 事件
如前所述,这发生在所有实现了IPostBackDataHandler接口的控件被正确的回传数据更新以后。在这个过程中,每个控件都有一个布尔值的标识,标识其自上一次提交后该控件的数据是被更改还是保持原值。然后ASP.NET通过搜索页来寻找任何显示控件数据被更改的标识并激发RaisePostDataChanged。RaisePostDataChanged事件直到Load事件发生后,所有控件被更新后才激发。这保证了在控件被回传数据更新前,其它控件的数据在RaisePostDataChanged事件中没有被手动更改过。
6.处理客户端回传事件
当回传更新导致数据改变而引发服务器端事件后,引发回传的对象会在RaisePostBackEvent事件中被处理。这种激发回传的对象往往是其状态改变而引发回传的控件(其autopostback被启用)或者是一个被点击的窗体提交按钮。很多代码都在这个事件中执行,因为这是控制事件驱动逻辑的理想位置。为了保证呈现到浏览器的数据的正确性,在一系列的回传事件后RaisePostBackEvent事件最终被激发。基于一致性的考虑,回传中改变的控件直到这个函数被执行后才被更新。也就是说,被预期事件改变的数据总是在结果页反映出来。RaisePostBackEvent事件可以通过RaisePostBackEvent来捕捉
7.对象预呈现
对象被预呈现的地方对于那些能够保存到视图或者维持其视图状态的对象来说是最后一次有机会改变的地方。这使得预呈现步骤成为做最后修改的理想位置,例如改变控件属性或改变控件树结构,不用担心因为数据库请求或者视图状态更新而导致对象的变化。预呈现阶段之后,对象改变被锁定并且不能再被保存到页视图状态中。预呈现阶段可以通过重载OnPreRender实现。
8.保存视图状态
只有在所有的页面对象的改变都发生后视图状态才被保存。对象状态数据被保存在隐藏<input>对象中,这也是对象状态数据准备呈现到HTML的地方。在SaveViewState事件中,值能够被保存到视图状态对象中,但页面控件的改变并不能保存到其中。可以通过重载SaveViewState实现这个步骤
9.呈现HTML
Render事件通过装配用于浏览器输出的HTML来着手页的创建。在Render事件中,页调用对象使它们呈现为HTML,然后页收集HTML来发送。当Render事件被重载的时候,开发者可以为浏览器创建定制的HTML,此时页面创建的任何HTML都还没有生效。Render 方法用HtmlTextWriter对象作参数并由它产生HTML给浏览器。这里仍然可以作修改,但是这样的修改只会反映到客户(译者注:意即改变只会在HTML呈现中反映而视图状态
并无法被改变)。Render 事件可以被重载
10.释放
当页面的HTML呈现后,对象被释放。在Dispose事件中,你可以清除任何在页面创建中构造的对象或者引用。在这里,所有的处理都已经被执行,你可以安全的释放任何还存在的对象,包括Page对象。Dispose能被重载
总结
每次我们请求一个ASP.NET页的时候,这个从初始化到释放的过程都同样的被执行。通过理解ASP.NET页的内部执行过程,编写和调试代码的时候就会更加容易和高效(更不用提会碰到更少的让我们灰心的事)。
相关推荐
页面生命周期是ASP.NET页面对象模型的核心概念,包括一系列事件,如初始化、加载、回发数据、验证、呈现和卸载。这些事件提供了开发者介入和控制页面行为的机会。例如,`Page_Load`事件用于在页面加载时执行特定...
ASP.NET页面有自己的生命周期,包括初始化、加载、验证、呈现和卸载等阶段。在ASP.NET第5章中,可能会详细解释每个阶段,以及如何在这些阶段中插入自定义代码。 5. **数据访问** ASP.NET提供了多种数据访问技术,...
ASP.NET页面生命周期包括初始化、加载、验证、呈现和卸载等阶段。在这些阶段,开发者可以插入代码以处理特定任务,如设置初始值、处理用户输入、保存状态等。 2. **控件事件处理**: ASP.NET控件支持各种事件,如...
2. **页面生命周期**:解释ASP.NET页面从请求到响应的生命周期,包括初始化、加载、回发和卸载等各个阶段。 3. **服务器控件**:介绍常见的ASP.NET服务器控件,如Label、TextBox、Button等,以及它们如何与后台代码...
在Asp.NET中,页面生命周期包括一系列的事件,这些事件按照特定的顺序依次触发,以确保页面从初始化到呈现的完整过程。理解这些事件的加载顺序对于开发高效且可靠的Web应用程序至关重要。以下是对Asp.NET页面事件...
ASP.NET页面事件的顺序如下: - Page_Init:在这个阶段,页面初始化,对象实例化。 - Page_Load:所有控件加载完成,可以在此时进行数据绑定。 - 控件事件:如按钮点击等用户交互触发的事件。 - Page_Unload:...
1. **页面生命周期**:ASP.NET页面从请求到响应的过程中经历一系列的生命周期阶段,包括初始化、加载、验证、呈现和卸载。理解这些阶段对于调试和优化代码至关重要。 2. **控件事件模型**:ASP.NET提供了丰富的...
当用户请求一个ASP.NET页面时,一系列事件会按顺序发生,包括初始化、加载、验证、呈现和卸载。开发者可以利用这些事件处理程序来编写代码,控制页面的行为。 在 ASP.NET 中,表单(Form)和控件(Control)是构建...
q designer.cs页文件:用来为页面的控件做初始化工作,一般只有ASP.NET应用程序(Web Application)才有。 ASP.NET页面中包含两种代码模型,一种是单文件页模型,另一种是代码隐藏页模型。这两个模型的功能完全一样...
- 页面生命周期描述了从请求开始到响应结束的整个过程,包括初始化、加载、渲染等多个阶段。 **4.6 ASP.NET生命周期中的事件** - **页面加载事件(Page_PreInit)**:在页面初始化之前触发。 - **页面加载事件...
页面生命周期包括初始化、加载、验证、呈现和卸载等阶段,了解这些可以帮助开发者控制何时处理数据和更新UI。状态管理则涵盖ViewState、Session、Application和Cookie等,学习如何在不同请求间保持数据。 3. **实验...
首先,当用户在浏览器中请求一个ASP.NET页面时,生命周期的第一步是“初始化”。在这个阶段,服务器创建一个新的页面实例,并对所有控件进行实例化。页面的公共属性被设置,但此时控件的属性值尚未加载,因此这是...
4. **ASP.NET页面生命周期**:理解ASP.NET页面从请求到响应的完整生命周期对于优化性能和调试至关重要。书中案例会展示如何在生命周期的不同阶段添加代码,如初始化、加载、回发和卸载事件。 5. **控件与用户界面**...
页面生命周期涉及初始化、加载、回发、呈现和卸载等阶段,理解这些阶段对于调试和优化代码至关重要。控件模型允许开发者通过拖放方式创建用户界面,而状态管理则确保在页面间保留用户信息。 2. **实例分类** 提供...
每个ASP.NET页面都有一系列的生命周期阶段,包括初始化、加载、回发数据绑定、验证、保存视图状态和卸载。理解这个生命周期对于有效管理页面状态和控制代码执行顺序至关重要。 5. **控件与事件**: ASP.NET中的...
2. **控件事件模型**:ASP.NET中的服务器控件具有事件驱动的编程模型,了解控件事件的触发顺序和如何处理事件对于编写交互性页面至关重要。 3. **数据绑定**:ASP.NET 3.5引入了强大的数据绑定机制,如Linq to SQL...
1. **页面生命周期**:理解ASP.NET页面生命周期是至关重要的,它包括初始化、加载、验证、呈现和卸载等阶段。在每个阶段,开发者可以插入适当的代码以执行特定的任务,如数据绑定、事件处理等。 2. **控件事件模型*...
1. **页面生命周期**:在ASP.NET 2.0中,每个Web页面都有一个特定的生命周期,包括初始化、加载、验证、呈现和卸载等阶段。通过分析源码,我们可以看到各个事件的触发顺序以及如何在这些阶段中进行自定义处理。 2. ...