生命周期概述net汇总.docx
- 文档编号:9866195
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:17
- 大小:131.50KB
生命周期概述net汇总.docx
《生命周期概述net汇总.docx》由会员分享,可在线阅读,更多相关《生命周期概述net汇总.docx(17页珍藏版)》请在冰豆网上搜索。
生命周期概述net汇总
3.1ASP.NET页生命周期概述
ASP.NET页运行时,此页将经历一个生命周期,在生命周期中将执行一系列处理步骤。
这些步骤包括初始化、实例化控件、还原和维护状态、运行事件处理程序代码以及进行呈现。
了解页生命周期非常重要,因为这样做您就能在生命周期的合适阶段编写代码,以达到预期效果。
此外,如果您要开发自定义控件,就必须熟悉页生命周期,以便正确进行控件初始化,使用视图状态数据填充控件属性以及运行任何控件行为代码。
(控件的生命周期基于页的生命周期,但是页引发的控件事件比单独的ASP.NET页中可用的事件多。
)
3.1.1常规页生命周期阶段
一般来说,页要经历下表概述的各个阶段。
除了页生命周期阶段以外,在请求前后还存在应用程序阶段,但是这些阶段并不特定于页。
有关更多信息,请参见ASP.NET应用程序生命周期概述。
阶段
说明
页请求
页请求发生在页生命周期开始之前。
用户请求页时,ASP.NET将确定是否需要分析和编译页(从而开始页的生命周期),或者是否可以在不运行页的情况下发送页的缓存版本以进行响应。
开始
在开始阶段,将设置页属性,如Request和Response。
在此阶段,页还将确定请求是回发请求还是新请求,并设置IsPostBack属性。
此外,在开始阶段期间,还将设置页的UICulture属性。
页初始化
页初始化期间,可以使用页中的控件,并将设置每个控件的UniqueID属性。
此外,任何主题都将应用于页。
如果当前请求是回发请求,则回发数据尚未加载,并且控件属性值尚未还原为视图状态中的值。
加载
加载期间,如果当前请求是回发请求,则将使用从视图状态和控件状态恢复的信息加载控件属性。
验证
在验证期间,将调用所有验证程序控件的Validate方法,此方法将设置各个验证程序控件和页的IsValid属性。
回发事件处理
如果请求是回发请求,则将调用所有事件处理程序。
呈现
在呈现之前,会针对该页和所有控件保存视图状态。
在呈现阶段中,页会针对每个控件调用Render方法,它会提供一个文本编写器,用于将控件的输出写入页的Response属性的OutputStream中。
卸载
完全呈现页并已将页发送至客户端、准备丢弃该页后,将调用卸载。
此时,将卸载页属性(如Response和Request)并执行清理。
生命周期事件
在页生命周期的每个阶段中,页将引发可运行您自己的代码进行处理的事件。
对于控件事件,通过以声明方式使用属性(如onclick)或以使用代码的方式,均可将事件处理程序绑定到事件。
页还支持自动事件连接,即,ASP.NET将查找具有特定名称的方法,并在引发了特定事件时自动运行这些方法。
如果@ Page指令的AutoEventWireup属性设置为true(或者未定义该属性,因为该属性默认为true),页事件将自动绑定至使用Page_事件的命名约定的方法(如Page_Load和Page_Init)。
有关自动事件连接的更多信息,请参见ASP.NETWeb服务器控件事件模型。
下表列出了最常用的页生命周期事件。
除了列出的事件外还有其他事件;不过,大多数页处理方案不使用这些事件。
而是主要由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
在该事件发生前:
∙Page对象会针对每个控件和页调用EnsureChildControls。
∙设置了DataSourceID属性的每个数据绑定控件会调用DataBind方法。
有关更多信息,请参见下面的数据绑定控件的数据绑定事件。
页上的每个控件都会发生PreRender事件。
使用该事件对页或其控件的内容进行最后更改。
SaveStateComplete
在该事件发生前,已针对页和所有控件保存了ViewState。
将忽略此时对页或控件进行的任何更改。
使用该事件执行满足以下条件的任务:
要求已经保存了视图状态,但未对控件进行任何更改。
Render
这不是事件;在处理的这个阶段,Page对象会在每个控件上调用此方法。
所有ASP.NETWeb服务器控件都有一个用于写出发送给浏览器的控件标记的Render方法。
如果创建自定义控件,通常要重写此方法以输出控件的标记。
不过,如果自定义控件只合并标准的ASP.NETWeb服务器控件,不合并自定义标记,则不需要重写Render方法。
有关更多信息,请参见开发自定义ASP.NET服务器控件。
用户控件(.ascx文件)自动合并呈现,因此不需要在代码中显式呈现该控件。
Unload
该事件首先针对每个控件发生,继而针对该页发生。
在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。
对于页自身,使用该事件来执行最后清理工作,如:
关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。
注意
在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。
如果尝试调用方法(如Response.Write方法),则该页将引发异常。
1 public partial class _Default :
System.Web.UI.Page
2 {
3 protected void Page_PreInit(object sender, EventArgs e)
4 {
5 Response.Write("Page_PreInit
");
6 }
7 protected void Page_Init(object sender, EventArgs e)
8 {
9 Response.Write("Page_Init
");
10 }
11 protected void Page_InitComplete(object sender, EventArgs e)
12 {
13 Response.Write("Page_InitComplete
");
14 }
15 protected void Page_PreLoad(object sender, EventArgs e)
16 {
17 Response.Write("Page_PreLoad
");
18 }
19 protected void Page_Load(object sender, EventArgs e)
20 {
21 Response.Write("Page_Load
");
22 }
23 protected void Page_LoadComplete(object sender, EventArgs e)
24 {
25 Response.Write("Page_LoadComplete
");
26 }
27 protected void Page_PreRender(object sender, EventArgs e)
28 {
29 Response.Write("Page_PreRender
");
30 }
31 protected void Page_PreRenderComplete(object sender, EventArgs e)
32 {
33 Response.Write("Page_PreRenderComplete
");
34 }
35 protected void Page_SaveStateComplete(object sender, EventArgs e)
36 {
37 Response.Write("Page_SaveStateComplete
");
38 }
39 protected void Page_Unload(object sender, EventArgs e)
40 {
41 //Response.Write("Page_Unload
");
42 int i = 0;
43 i++;//这里不能用Response.Write
44 }
45 protected void Button1_Click(object sender, EventArgs e)
46 {
47 Response.Write("Button事件触发!
");
48 }
49 }
50
输出结果如下:
单击Button1按钮后,输出结果如下:
其他的页生命周期注意事项
各个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关键字(在VisualBasic中为Overrides)重写页的OnLoad方法,则必须显式调用基方法。
例如,如果在页中重写OnLoad方法,则必须调用base.Load(在VisualBasic中为MyBase.Load)以运行基实现。
添加的控件的追赶事件
如果控件是在运行时动态创建的,或者是以声明方式在数据绑定控件的模板中创建的,它们的事件最初与页上的其他控件的事件并不同步。
例如,对于运行时添加的控件,Init和Load事件在页生命周期中的发生时间可能要比以声明方式创建的控件的相同事件晚得多。
因此,从实例化那一刻起,动态添加的控件的事件就一直是在模板中的控件的事件之后发生,直到赶上该控件加入Controls集合时所对应事件为止。
一般来说,除非存在嵌套数据绑定控件,否则,您不必担心这种情况。
如果子控件已执行数据绑定,但其容器控件尚未执行数据绑定,则子控件中的数据与其容器控件中的数据可能不同步。
如果子控件中的数据根据容器控件中的数据绑定值执行了处理,这种情况则尤其显著。
例如,假定有一个GridView,它的每一行显示一条公司记录,此外,有一个ListBox控件包含公司管理者列表。
若要填充管理者列表,则需要将ListBox控件绑定到一个数据源控件(如SqlDataSource),后者在查询中使用CompanyID来检索公司管理者数据。
如果以声明方式设置了ListBox控件的数据绑定属性(如DataSourceID和DataMember),ListBox控件将尝试在包含行的DataBinding事件期间绑定到其数据源。
不过,行的CompanyID字段直到GridView控件的RowDataBound事件发生后才包含值。
这种情况下,先绑定子控件(ListBox控件),后绑定包含控件(GridView控件),因此它们的数据绑定阶段并不同步。
若要避免此种情况,需要将ListBox控件的数据源控件与ListBox控件自身放在同一模板项中,并且不要以声明方式设置ListBox的数据绑定属性。
而应在RowDataBound事件期间在运行时以编程方式设置它们,这样,到CompanyID信息可用时ListBox控件才会绑定到其数据。
有关更多信息,请参见使用数据源控件绑定到数据。
数据绑定控件的数据绑定事件
为了帮助您理解页生命周期与数据绑定事件之间的关系,下表列出了数据绑定控件(如GridView、DetailsView和FormView控件)中与数据相关的事件。
控件事件
典型使用
DataBinding
该事件在包含控件(或Page对象)的PreRender事件之前由数据绑定控件引发,会标记控件到数据的绑定过程的起点。
如果需要,使用该事件以手动方式打开数据库连接。
(数据源控件通常不需要如此操作。
)
RowCreated(仅限GridView)或ItemCreated(DataList、DetailsView、SiteMapPath、DataGrid、FormView和Repeater控件)
使用该事件来操作不依赖于数据绑定的内容。
例如,在运行时,可以以编程方式向GridView控件中的页眉或页脚行添加格式。
RowDataBound(仅限GridView)或ItemDataBound(DataList、SiteMapPath、DataGrid和Repeater控件)
当该事件发生时,行或项中的数据可用,因此,可以在子数据源控件上格式化数据或设置FilterExpression属性,以便显示行或项中的相关数据。
DataBound
该事件在数据绑定控件中标记数据绑定操作的结尾。
在GridView控件中,会针对所有行和任何子控件完成数据绑定。
使用该事件格式化数据绑定内容,或在依赖来自当前控件的内容的值的其他控件中启动数据绑定。
(有关详细信息,请参见本主题中前面的“添加的控件的追赶事件”。
)
登录控件事件
Login控件可以使用Web.config文件中的设置来自动管理成员资格验证。
不过,如果应用程序要求您自定义控件的工作方式,或者您要了解Login控件事件与页生命周期的关联方式,可以使用下表中列出的事件。
控件事件
典型使用
LoggingIn
在回发期间,当页的LoadComplete事件发生后就会引发该事件。
它标记登录过程的起点。
对必须在验证过程开始前发生的任务使用该事件。
Authenticate
该事件在LoggingIn事件之后引发。
使用该事件来重写或增强Login控件的默认验证行为。
LoggedIn
该事件在验证用户名和密码后引发。
使用该事件来重定向到另一个页或动态设置控件中的文本。
如果出现错误或验证失败,就不会发生该事件。
LoginError
如果验证失败,将引发该事件。
使用该事件来设置控件中的问题解释文本或将用户定向到不同的页。
请参见
参考
在ASP.NET网页中验证用户输入
ASP.NET登录控件概述
概念
ASP.NETWeb服务器控件事件模型
ASP.NETWeb应用程序中的页和应用程序上下文
视图状态概述
使用数据源控件绑定到数据
3.2ASP.NET状态管理概述
3.2.1ASP.NET状态管理概述
每次将网页发送到服务器时,都会创建网页类的一个新实例。
在传统的Web编程中,这通常意味着在每一次往返行程中,与该页及该页上的控件相关联的所有信息都会丢失。
例如,如果用户将信息输入到文本框,该信息将在从浏览器或客户端设备到服务器的往返行程中丢失。
为了解决传统的Web编程的固有限制,ASP.NET包括了几个选项,可帮助您按页保留数据和在整个应用程序范围内保留数据。
这些功能如下所示:
∙视图状态
∙控件状态
∙隐藏域
∙Cookie
∙查询字符串
∙应用程序状态
∙会话状态
∙配置文件属性
视图状态、控件状态、隐藏域、Cookie和查询字符串均会涉及以不同方式将数据存储到客户端上。
而应用程序状态、会话状态和配置文件属性都将数据存储到服务器上的内存中。
每个选项都有不同的优点和缺点,具体取决于相应的方案。
基于客户端的状态管理选项
下面各节描述一些状态管理选项,这些选项涉及在页中或客户端计算机上存储信息。
对于这些选项,在各往返行程间不会在服务器上维护任何信息。
视图状态
ViewState属性提供一个字典对象,用于在对同一页的多个请求之间保留值。
这是页用来在往返行程之间保留页和控件属性值的默认方法。
在处理页时,页和控件的当前状态会散列为一个字符串,并在页中保存为一个隐藏域或多个隐藏域(如果存储在ViewState属性中的数据量超过了MaxPageStateFieldLength属性中的指定值)。
当将页回发到服务器时,页会在页初始化阶段分析视图状态字符串,并还原页中的属性信息。
也可以使用视图状态来存储值。
有关详细信息,请参见如何:
保存视图状态中的值。
有关何时应使用视图状态的建议,请参见ASP.NET状态管理建议。
控件状态
有时,为了让控件正常工作,您需要按顺序存储控件状态数据。
例如,如果编写了一个自定义控件,其中使用了不同的选项卡来显示不同的信息。
为了让自定义控件按预期的方式工作,该控件需要知道在往返行程之间选择了哪个选项卡。
可以使用ViewState属性来实现这一目的,不过,开发人员可以在页级别关闭视图状态,从而使控件无法正常工作。
为了解决此问题,ASP.NET页框架在ASP.NET中公开了一项名为控件状态的功能。
ControlState属性允许您保持特定于某个控件的属性信息,且不能像ViewState属性那样被关闭。
隐藏域
ASP.NET允许您将信息存储在HiddenField控件中,此控件将呈现为一个标准的HTML隐藏域。
隐藏域在浏览器中不以可见的形式呈现,但您可以就像对待标准控件一样设置其属性。
当向服务器提交页时,隐藏域的内容将在HTTP窗体集合中随同其他控件的值一起发送。
隐藏域可用作一个储存库,您可以将希望直接存储在页中的任何特定于页的信息放置到其中。
安全注意
恶意用户可以很容易地查看和修改隐藏域的内容。
请不要在隐藏域中存储任何敏感信息或保障应用程序正确运行的信息。
有关更多信息,请参见ASP.NET状态管理建议。
HiddenField控件在其Value属性中只存储一个变量,并且必须通过显式方式添加到页上。
有关更多信息,请参见HiddenFieldWeb服务器控件概述。
为了在页处理期间能够使用隐藏域的值,必须使用HTTPPOST命令提交相应的页。
如果在您使用隐藏域的同时,为了响应某个链接或HTTPGET命令而对页进行了相应处理,那么隐藏域将不可用。
有关推荐的使用方法,请参见ASP.NET状态管理建议。
Cookie
Cookie是一些少量的数据,这些数据或者存储在客户端文件系统的文本文件中,或者存储在客户端浏览器会话的内存中。
Cookie包含特定于站点的信息,这些信息是随页输出一起由服务器发送到客户端的。
Cookie可以是临时的(具有特定的过期时间和日期),也可以是永久的。
可以使用Cookie来存储有关特定客户端、会话或应用程序的信息。
Cookie保存在客户端设备上,当浏览器请求某页时,客户端会将Cookie中的信息连同请求信息一起发送。
服务器可以读取Cookie并提取它的值。
一项常见的用途是存储标记(可能已加密),以指示该用户已经在您的应用程序中进行了身份验证。
安全注意
浏览器只能将数据发送回最初创建该Cookie的服务器。
但是,恶意用户可通过多种方法访问Cookie并读取其中的内容。
建议您不要将敏感信息(如用户名或密码)存储在Cookie中。
您可以在Cookie中存储一个标识用户的标记,然后使用该标记在服务器上查找敏感信息。
有关使用Cookie的更多信息,请参见Cookies和ASP.NET状态管理建议。
查询字符串
查询字符串是在页URL的结尾附加的信息。
下面是一个典型的查询字符串示例:
复制
在上面的URL路径中,查询字符串以问号(?
)开始,并包含两个属性/值对:
一个名为“category”,另一个名为“price”。
查询字符串提供了一种维护状态信息的方法,这种方法很简单,但有使用上的限制。
例如,利用查询字符串可以很容易地将信息从一页传送到另一页。
例如,将产品号从一页传送到将处理该产品号的另一页。
但是,大多数浏览器和客户端设备会将URL的最大长度限制为2083个字符。
安全注意
在查询字符串中传递的信息可能会被恶意用户篡改��不要依靠查询字符串来传递重要的或敏感的数据。
此外,用户可以创建URL的书签或将URL发送给其他用户,从而将这些信息与UR
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 生命周期 概述 net 汇总