本文整理自《ASP.NET3.5核心编程》,以下内容适用于ASP.NET2.0以上版本。
Page类提供了由.aspx文件创建所有对象的基本行为。(这个有<asp:Control />标签生成C#描述的类型的对象的过程是我们看不到的,这是由编译器自动完成的。)Page可以实现这个功能是由于其实现了IHttpHandler接口。实现IHttpHandler接口,就可以充当相应类型的(此处为.aspx文件)的HTTP请求的处理程序。IHttpHandler接口的关键方法ProcessRequest完成了上述由.aspx文件创建所有对象的过程。
Page的父类TemplateControl定义了页面(或控件)的一组基本功能。TemplateControl上层的Control类定义ASP.NET服务器端元素(包括页面、控件和用户控件)共享的属性、方法和事件。TemplateControl实现的INamingContainer接口使Page可以作为控件的容器。
Page类的属性
Page类的属性分为三类:内置对象、Worker属性和页面特有的属性。以下分别介绍:
内部对象
这些属性的类型都是页内部的辅助对象,它们都是使页面能够正常执行的基本元素。
属 性 |
说 明 |
Application |
返回HttpApplicationState类的实例。它代表当前应用程序的状态。 |
Cache |
返回Cache类的实例,为ASP.NET应用程序实现了缓存。其支持任务优先级和到期(expiration),且比Application效率更高,功能更强 |
Profile |
返回ProfileCommon类的实例。它代表与请求关联的、用户特有的数据集合 |
Request |
返回HttpResponst类的实例。它代表当前HTTP请求。 |
Response |
返回HttpResponse类的实例。它用于将HTTP响应数据发送给客户端。 |
Server |
返回HttpServerUtility类的实例。它提供处理Web请求的辅助方法。 |
Session |
返回HttpSessionState类的实例。它用于管理用户特有的数据。 |
Trace |
返回TraceContext类的实例。它用于对页面进行跟踪 |
User |
返回IPrincipal类型的对象。它代表发出请求的用户 |
Worker属性
这些属性用于承载信息和提供基本功能。在进行页面编程时,这些属性必不可少。
属 性 |
说 明 |
ClientScript |
用于获取ClientScriptManager对象,它包含页面使用的客户端脚本。 |
Controls |
返回当前页面包含的字控件集合 |
ErrorPage |
表示错误页的属性,在发生未处理页面异常时,发出请求的浏览器会被重定向到该页面上 |
Form |
返回当前页面的HtmlForm对象 |
Header |
返回代表当前页面标头的对象。该对象实现了IPageHeader接口。 |
IsAsync |
用于指示当前页是否被异步处理程序调用。 |
IsCallback |
用于指示当前被加载的页面是否为客户端脚本回调的结果。 |
IsCrossPagePostBack |
用于指示当前被加载的页面是否是对另一个页面回发的响应 |
IsPostBack |
用于指示当前被加载的页面是对客户端回发的响应,还是第一次加载 |
IsValid |
用于指示页面验证是否成功 |
Master |
返回MasterPage类的实例。它代表确定当前页面外观的母版页。 |
MasterPageFile |
表示当前页面的母版页的文件名的属性 |
NamingContainer |
返回null |
Page |
返回当前Page对象(C#中就是this) |
PageAdapter |
返回当前Page对象的适配器对象 |
Parent |
返回null |
PreviousPage |
返回跨页回发中主调用页的引用 |
TemplateSourceDirectory |
获取当前页面的虚拟路径 |
Validators |
返回页中包含的所有验证控件的集合 |
ViewStateUserKey |
字符串类型的属性,代表用户特有的标识,用于对视图状态的内容进行散列加密(hash)。该措施是单键攻击(one-click attack)的防线之一 |
解释:由于Page对象处于层状结构的根节点。所以,NamingContainer与Parent属性总是返回null。ViewStateUserKey可以接受用户特有的信息,这些信息可以是通过验证的会话id等。此属性可以被用来加密ViewState等。另外ViewStateUserKey必须在Page_Init中设置。
上下文属性
这些属性代表页面的可视和非可视属性(attribute)
属 性 |
说 明 |
ClientID |
总是返回空字符串 |
ClientQueryString |
获取被请求URL的查询字符串部分。 |
ClientTarget |
默认为空字符串,允许开发者指定浏览器类型,以便生成正确的HTML。设置此属性将禁用浏览器的自动检测功能 |
EnableViewState |
用于指示当前页是否管理视图状态信息。作用相当于@Page中的EnableViewState属性 |
EnableViewStateMac |
用于指示ASP.NET是否需要生成计算机特有的身份验证吗(MAC),并将其追加到页面的视图状态中 |
EnableTheming |
用于指示当前页是否支持主题 |
ID |
总是返回空字符串 |
MaintainScrollPositionOnPostback |
用于指示在回发后是否恢复客户端浏览器的滚动条位置 |
SmartNavigation |
用于指示是否开启智能导航。智能导航利用了大量浏览器特有的功能来加深用户对页面的体验 |
StyleSheetTheme |
表示应用于当前页面的样式表名称 |
Theme |
表示应用于页面的主题的名称。注意,若以编码的方式设置主题,则只能在PreInit事件中进行。 |
Title |
表示页面的标题的属性 |
TraceEnabled |
打开或关闭当前页的跟踪功能 |
TraceModeValue |
获取或设置跟踪模式 |
UniqueID |
总是返回空字符串 |
ViewStateEncryptionMode |
用于指示是否加密视图状态及加密方式 |
Visible |
用于指示ASP.NET是否呈现该页面。如果将Visible设置为false,ASP.NET不会为该页生成任何HTML代码,且只有显示使用Response.Write写入的文本会被发往客户端 |
Page对象中三个与ID有关的属性 – ID、ClientID与UniqueID总返回空字符串,因为这些仅用于服务器控件,在Page中没有意义。
Page类的方法
Page类的方法可以按功能分为以下几类。分别总结如下:
用于呈现(生成标记)的方法
方 法 |
说 明 |
DataBind |
用于将页面中的所有可数据绑定的控件绑定到它所对应的数据源上。DataBind方法本身不会生成代码,但为后续的呈现铺平道路 |
RenderControl |
用于将当前页面输出为HTML文本,如果启用跟踪,结果中将会包含跟踪信息 |
VerifyRenderingInServerForm |
控件在生成时会调用该方法,以确保服务器窗体的主体中包含它们。该方法不会返回值,但发生错误时会抛出异常 |
说明:在ASP.NET中所有runat属性为server的控件都需要放置在<form>标签内,以使其可以由VerifyRenderingInServerForm方法来确保自身被正确呈现。
控件相关的方法
方 法 |
说 明 |
DesignerInitialize |
当页面处于Visual Studio设计器模式中时,该方法用于对Page类的实例进行初始化 |
FindControl |
通过控件的ID在页面的命名容器中查找它。该搜索不会进入本身也为命名容器的子控件 |
GetTypeHashCode |
用于在运行时获取由ASP.xxx_aspx页面类生产的哈希码。在基类Page中,该方法的实现仅仅是返回0,而实际的页面类会返回大量数字 |
GetValidators |
返回指定验证组(validation group)的控件验证程序集合。 |
HasControls |
检查当前页是否包含子控件 |
LoadControl |
用于编译并加载.ascx文件中的用户控件,之后会返回一Control对象。如果该用户控件支持缓存,则返回PartialCachingControl |
LoadTemplate |
编译并加载.ascx文件中的用户控件,返回实现ITemplate接口的内部类的实例,它对该控件进行了封装。这个内部类名为SimpleTemplate |
MapPath |
获取映射到绝对或相对虚拟路径的完整物理地址 |
ParseControl |
用于对输入的有效字符串进行解析,返回指定标记文本所对应的控件实例。如果该字符串包含多个控件,则只有第一个有效。runat属性会被忽略。该方法返回的是一个Control类型的实例,因而必须转换成更具体的类型 |
RegisterRequiresControlState |
将控件注册为具有持久性控件状态的。 |
RegisterRequiresPostBack |
用于注册指定控件,使其能够接收到回发处理通知(即便其ID与已回发数据集合中的任何ID都不匹配)。该控件必须实现IPostBackDataHandler接口 |
RegisterRequiresRaiseEvent |
用于注册指定控件,使其能够处理输入的回发事件。该控件必须实现IPostBackEventHandler接口 |
RegisterViewStateHandler |
该方法用于设置一内部标志,以便保持当前页视图状态,多数情况为内部使用。如果该方法没有在预呈现阶段被调用,则不会写入任何视图状态。一般仅有页面的HtmlForm服务器控件会调用该方法。不需要在用户应用程序中调用 |
ResolveUrl |
根据TemplateSourceDirectory属性值,将一相对URL解析为绝对URL |
Validate |
使页中的所有验证控件对其被赋予的信息进行验证。ASP.NET 2.0支持验证组,对需要验证的控件进行逻辑分类,且各组之间互不干扰 |
这些方法中,有如下值得说道的,LoadControl和LoadTemplate方法除了在返回值得类型上,前者返回Control类对象,后者返回ITemplate类型对象外其于内部代码都相同。另外这两个方法区别于ParseControl方法的地方在于后者不引发编译,而只是解析字符串并推断控件信息。该信息用于控件实例的创建及初始化。
脚本相关的方法
以下这些Page类的方法用于将Html和脚本代码插入到客户端页面。
方法 |
说明 |
GetCallbackEventReference |
用于获取客户端函数的引用。该函数被调用时,将引发客户端向服务器端的回调事件 |
GetPostBackClientEvent |
转而调用GetCallbackEventReference |
GetPostBackClientHyperlink |
用于向从GetPostBackEventReference返回的字符串的开始处追加“javascript:”,如:javascript:__doPostBack('CtlID','') |
GetPostBackEventReference |
返回客户端脚本函数的原型。当该脚本函数被调用时,将引起回发的执行。它接受一个Control对象和一个参数,返回的字符串形式如下:__doPostBack('CtlID','') |
IsClientScriptBlockRegistered |
用于确定页面是否注册了指定的客户端脚本。该方法已被标记为过时 |
IsStartupScriptRegistered |
用于确定页面是否注册了指定的客户端启动脚本。该方法已被标记为过时 |
RegisterArrayDeclaration |
该方法用于将ECMAScript数组添加到客户端页面上。其接受一数组名和一个代表数组主体的字符串。例如,如果以theArray 和“'a', 'b'”为参数调用该方法,则会得到以下JavaScript代码:var theArray = new Array('a', 'b'); 该方法已被标记为过时 |
RegisterClientScriptBlock |
ASP.NET页使用这个方法向客户端页面的HTTP <form>元素的开标记后添加脚本代码块。该方法已被标记为过时 |
RegisterHiddenField |
用于自动向页面注册隐含字段。该方法已被标记为过时 |
RegisterOnSubmitStatement |
该方法用于添加处理OnSubmit事件的客户端脚本代码。该脚本应为一个JavaScript函数,它会调用已在某处注册的脚本代码。该方法已被标记为过时 |
RegisterStartupScript |
ASP.NET页使用这个方法向客户端页面的HTTP <form>元素的闭标记前添加脚本代码块。该方法已被标记为过时 |
SetFocus |
将浏览器的焦点设置在指定控件上。 |
这其中很多方法被标记为过时,我们应该使用Page的ClientScript中的相关方法来操作客户端脚本。当我们使用RegisterXXX方法注册脚本时,脚本被缓存在一个结构中并在页面渲染后背生产到最终的Html文档里。
Page类的事件
在页面生命周期里,会触发一些列的事件。这些事件一般都标记者一个关键的处理阶段。
事件 |
说明 |
AbortTransaction |
若ASP.NET页参与自动事务,该事件会在事务中止时引发 |
CommitTransaction |
若ASP.NET页参与自动事务,该事件会在事务提交时引发 |
DataBinding |
在页的DataBind方法被调用时引发。该方法会对页中的所有子控件与其所对应的数据源进行绑定 |
Disposed |
在页从内存中被释放后引发。该事件标志着页面生命周期的最后阶段 |
Error |
在未处理异常被抛出时引发 |
Init |
在页面被初始化时引发。该事件标志着页面生命周期的第一个阶段 |
InitComplete |
在页及其所有子控件全部初始化完毕后引发。ASP.NET 1.x不支持该事件 |
Load |
在页面初始化完毕后,进行加载时引发 |
LoadComplete |
在页面加载结束,且服务器事件也已引发完毕后引发。ASP.NET 1.x不支持该事件 |
PreInit |
在页面的初始化阶段开始时引发。ASP.NET 1.x不支持该事件 |
PreLoad |
在页面的加载阶段开始时引发。ASP.NET 1.x不支持该事件 |
PreRender |
在页面即将被呈现时引发 |
PreRenderComplete |
在页面的预呈现阶段开始时引发。ASP.NET 1.x不支持该事件 |
SaveStateComplete |
在页面的视图状态已存储在持久性介质中后引发。ASP.NET 1.x不支持该事件 |
Unload |
在页从内存中被卸载后但尚未释放前引发 |