再谈ASP.NET第三 - ASP.NET的页面处理指令
这篇文章摘自《ASP.NET3.5核心编程》,这部分内容在之前的学习过程中常常被忽略掉。现整理此文为以后的使用打基础。摘抄部分适用于ASP.NET2.0以上版本。
页面处理指令用于配置执行该页面的运行环境。在ASP.NET中页面处理指令可以位于页面的任何位置,但习惯做法是将其置于文件的开始部分。页面处理指令不区分大小写,且指令的属性值(attribute)也不必加引号。
下表列出了所有ASP.NET指令
指 令 |
说 明 |
@Assembly |
用于将程序集链接到当前页面的或用户控件上 |
@Control |
用于定义控件特有的属性。这些属性会控制控件编译器的行为 |
@Implements |
用于指示当前页面或当前用户控件实现指定的.NET Framework接口 |
@Import |
用于显示地将命名空间导入到页面或用户控件中 |
@Master |
用于指示将当前页面标识为ASP.NET母板页 |
@MasterType |
当通过Master属性访问ASP.NET母板页时,其会为母板页提供一种创建强类型引用的方式 |
@OutputCache |
用于控制页面或用户控件的输出缓存策略 |
@Page |
用于定义页面特有的属性,以便控制处理该页面的页面编辑器和语言解析器的行为 |
@PreviousPageType |
提供了一种获取之前的页面强类型引用的方式,通过PreviousPage属性便可以对之前的页面进行访问 |
@Reference |
用于将页面或用户控件链接到当前页面或用户控件上 |
@Register |
用于在页面或控件中创建自定义标签。新的标签(包括前缀和名称)会将命名空间和用户定义的控件关联起来 |
以上页面指令中@Page与@PreviousPageType仅用于页面中,@Control仅用于控件中,@Master与@MasterType仅用于母版页中。其余的页面指令可以同时用于页面与控件中。
处理指令的语法比较特殊,多个属性之间须用空白分割,属性与值间的等号(=)两边不能有空白,如下所示:
<% Directive_Name attribute="value" [attribute="value" … ] %>
每种指令都有自己类型化的属性集合。将错误类型的值赋给一个属性,或在某个属性中使用错误的属性,都会导致编译错误。指令的属性值是以纯文本的形式来设置的,在内部它们被类型转换器转换为相应的类型。
@Page指令
@Page是ASP.NET中最常用的指令。@Page只能用于.aspx页面中,在其它任何地方使用都会导致编译错误。每个.aspx文件最多只能包含一个@Page指令。虽然此指定没有必要强制指定,但实际所有的复杂页面都包含了此指令。
@Page指令大约有30个属性,从逻辑上可以将这些属性分为三类:编译、页面整体行为和页面输出。每个ASP.NET页在第一次请求时进行编译,实际发送给浏览器的HTML是类的方法生成的,而这些类也是动态生成的。
用于页面编译的@Page指令的属性
属 性 |
说 明 |
ClassName |
用于指定页面被请求时动态生成的类的名称。其必须是不带命名空间信息的类名 |
CodeFile |
用于提示当前页面代码文件隐藏类的路径。该类文件必须被部署到Web服务器上。 |
CodeBehind |
已过时,请使用CodeFile属性 |
CodeFileBaseClass |
用于指定页的基类及其关联的代码隐藏类的基类名称。该属性是可选的,但如果使用了CodeFile属性,则必须指定该属性。 |
CompilationMode |
用于指示当前页面是否在运行时编译。 |
CompilerOptions |
用于编译当前页的一系列编译器命令行参数 |
Debug |
一个布尔值,用于指示是否应使用调试符号编译该页 |
Explicit |
用于使用VB.NET作为代码的情况 |
Inherits |
用于定义当前页要继承的基类,它可以为从Page类派生的任何类 |
Language |
用于在编译时提示内联代码块(<% … %>)和<script>区段中代码所使用的语言。支持的语言包括Visual Basic .NET、C#、Jscript.NET和J#。如果没有另外指定,默认采用Visual Basic .NET |
LinePragmas |
用于确定运行时是否应在源代码中生成行杂注(line pragma) |
MasterPageFile |
用于指示当前页面的母版页。 |
Src |
用于指示包含实现Inherits指定的积累的源文件路径。Visual Studio等RAD设计器不使用该属性 |
Strict |
一个布尔值,用于使用VB.NET作为代码的情况 |
Trace |
一个布尔值,用于指示是否开启跟踪功能。如果启用跟踪功能,额外的信息会被追加到页面的输出中。默认值为false |
TraceMode |
当启用跟踪功能时,提示当前页面跟踪消息的显示方式。有效值为SortByTime和SortByCategory。若跟踪功能开启,该属性的默认值为SortByTime |
WarningLevel |
提示编译器的警告级别,当达到指定的级别时,编译过程将终止。有效值为0~4 |
以上这些类用于对编译器参数进行调整,并能够选择要使用的语言。
用于控制页面行为的@Page指令属性
属 性 |
说 明 |
AspCompat |
布尔类型的属性。若设置为true,则允许当前页面在单线程单元(STA)线程上执行。该设置使页能够调用COM+1.0组件,以及用Visual Basic 6.0开发的需要访问非托管ASP内置对象的组件 |
Async |
如果设置为true,则生成的页面类将派生于IHttpAsyncHandler,而不是使用IHttpHandler将某些内建的非同步功能添加到页中。 |
AsyncTimeOut |
用于定义处理异步任务时使用的超时时间(单位为秒)。默认为45秒 |
AutoEventWireup |
布尔类型属性,用于指示是否启用页面的事件。默认为true。使用Visual Studio开发的页会将该属性设置为false,页面的事件会被分别绑定到处理程序上 |
Buffer |
布尔类型的属性,用于确定是否启用HTTP相应缓冲。默认值为true |
Description |
用于提供当前页面的文本描述。ASP.NET页解析器会忽略该属性,而只用作文档说明 |
EnableEventValidation |
布尔类型的属性,用于决定是否使当前页面生成一隐含字段,为支持事件数据验证的输入字段做缓冲。默认值为true。 |
EnableSessionState |
用于定义当前页面处理会话数据的方式。如果设为true,则可以读/写会话状态。如果设为false,则应用程序无法使用会话数据。最后,如果设为ReadOnly,则只能读取会话数据,而不能更改。 |
EnableViewState |
布尔类型的属性,用于指示是否在页面请求间保持视图状态。视图状态的是页面调用的上下文,用于保存往返过程之间当前页面状态值的集合 |
EnableTheming |
布尔类型的属性,用于指示当前页是否对嵌入的控件应用主题。默认值为true。 |
EnableViewStateMac |
布尔类型的属性,用于指示ASP.NET是否为特定的计算机生成身份验证码,并将其追加到页的视图状态中(除Base64编码)。属性中的的Mac代表"计算机身份验证检查"(machine authentication check, MAC)。若将该属性设置为true,则在回发时,ASP.NET会检查视图状态的身份验证码,以便确保其在客户端上没有被篡改 |
ErrorPage |
定义一个目标URL,后者指向一提示页。在页发生未处理异常时,用户会被重定向到该位置 |
MaintainScrollPositionOonPostback |
用于指示是否在回发之后恢复客户端浏览器的浏览器的滚动条位置。默认值为false |
SmartNavigation |
布尔类型的属性,用于指示当前页是否支持Internet Explorer 5或更高版本的智能导航功能。智能导航使得页面刷新后不会失去滚动位置和元素焦点 |
Theme, StyleSheetTheme |
用于指示为当前页选择的主题(或样式表主题)名称。 |
Transaction |
用于指示当前页是否支持或需要事务。有效的值为:Disabled、NotSupported、Supported、Required和RequiredNew。默认情况下,事务支持是被禁用的 |
ValidateRequest |
布尔类型的属性,用于指示是否执行请求验证。如果设置为true,ASP.NET将根据一硬编码的潜在危险值列表对所有的输入数据进行检查。该功能有助于降低页面的跨站点脚本攻击风险。默认值为true。 |
ViewStateEncryptionMode |
用于指示视图状态的加密方式。有三个可能的枚举值:Auto、Always和Never。默认值为Auto,这表明只有在控件要求时才加密视图状态。注意,每次请求的页面处理都加密视图状态数据,会对服务器造成一定的额外开销。 |
以上属性在某种程度上控制页的整体行为和支持的功能。例如,我们可以设置自定义的错误页、禁用会话状态,以及控制页面的事务处理行为。
用于控制输出的@Page指令属性
属 性 |
说 明 |
ClientTarget |
用于指示ASP.NET服务器控件呈现其内容时所要面向的浏览器 |
CodePage |
用于指示相应的代码页值。只有在使用一个代码页创建该页(而不是使用运行该页的Web服务器的默认代码页)时,才设置该属性。在这种情况下,将该属性设置为开发计算机的代码页。代码页是一个符号集合,包括数字、标点和其他符号。不同语言的代码页会有区别 |
ContentType |
用于将响应的内容类型定义为标准的MIME类型。支持任何有效的HTTP内容类型字符串 |
Culture |
用于指示当前页的区域性设置。区域性信息包括书写与排序系统、日历和货币格式。该属性值必须为区域性相关的名称,即它必须包含语言和国家信息。例如,en-US就是一个有效值,而en本身则会被认为是国家不相关的 |
LCID |
32位的值,用于定义页的区域标识符。默认情况下,ASP.NET会使用Web服务器的区域设置 |
ResponseEncoding |
用于指示当前页面的编码方案名称。该值用于设置内容类型HTTP标头的CharSet属性。在内部,ASP.NET会将所有字符串按Unicode处理 |
Title |
用于指示当前页的标题。对于一般的页面作用不大,因为可以使用HTML的<title>标签,该属性的定义是为了帮助开发者在内容页中不能访问<title>的情况下(这取决于母版页的结构设计),为其设置标题 |
UICulture |
用于指定资源管理器(Resource Manager)使用的默认区域信息名称,以便在运行时查找区域性特定的资源 |
以上指令属性用于控制为页面生成的输出信息格式。例如,我们可以设置页面的内容类型,或者尽可能地使输出本地化(这其中大部分属性也是与页面的本地化有关)。
@Assembly指令
@Assembly指令用于将某个程序集链接到当前页面,使其类和接口可以在该页面上使用。在ASP.NET编译该页时,会有几个默认的程序集被链接进去。因此,只有在需要链接一个非默认程序集时,才能使用该指令。下表是自动提供给编译器的.NET程序集(适用ASP.NET2.0以上的版本)。
程序集文件名 |
说明 |
Mscorlib.dll |
提供.NET Framework的核心功能,包括类型、AppDomain和运行时服务 |
System.dll |
提供另一组系统服务,包括正则表达式、编译、本地方法、文件输入/输出和网络 |
System.Configuration.dll |
定义了读/写配置文件数据的类。 |
System.Data.dll |
定义了数据容器和数据访问类,包括整个ADO.NET框架 |
System.Drawing.dll |
实现了GDI+功能 |
System.EnterpriseServices.dll |
提供了允许被服务的组件和COM+之间进行交互的类 |
System.Web.dll |
该程序集实现了ASP.NET核心服务、控件和类 |
System.Web.Mobile.dll |
该程序集实现了ASP.NET核心移动服务、控件和类。 |
System.Web.Services.dll |
包含驱动Web服务运行的核心代码 |
System.Xml.dll |
实现了.NET Framework的XML功能 |
System.Runtime.Serialization.dll |
定义了.NET 序列化功能的API。在ASP.NET2.0应用程序中,该程序集是开发者额外添加的最常用的程序集之一。 |
System.ServiceModel.dll |
定义了Windows Communication Foundation(WCF)服务的类和结构 |
System.ServiceModel.Web.dll |
定义了ASP.NET和AJAX需要使用的附加类 |
System.WorkflowServices.dll |
定义了工作流(Workflow)和WCF服务需要的类 |
以上淡绿色背景是ASP.NET3.5版本开始自动引入的程序集。可以通过更改计算机级的Web.config文件来改变上述列表提到的默认引用的程序集。当然也可以更改Web应用程序自己的Web.config来更改默认引用的程序集。
除以上程序集之外,ASP.NET运行库还会自动将Web应用程序Bin子目录中的所有程序集链接到所有页面上。可以删除Web.config中的<add assembly="*">来防止这些Bin中的程序集的自动添加。
@Assembly指令支持两个互斥的属性:Name和Src。
Name用于提示链接到页面的程序集名称。该名称不能包含路径和扩展名。
Src用于指示要编译并链接到页面的源文件路径。
以上两个属性是互斥的,也就是说一条@Assembly指令中只能有Name或Src之一。
使用方式:
1 <%@ Assembly Name="AssemblyName" %> 2 <%@ Assembly Src="assembly_code.cs"% >
@Import指令
@Import指令用于将指定的命名空间链接到页面,以便所有已定义类型可以在页面访问,而不必使用完全限定名(fully qualified name)。其使用方式:
1 <%@ Import namespace="value" %>
.aspx页面中@Import指令相当于.cs文件中的using语句。在ASP.NET2.0这种代码分离模式下,往往直接在代码隐藏文件中导入命名空间而很少使用Import指令。
@Implements
@Implements指令用于指示当前页面实现的.NET Framework中的特定接口。接口是一组逻辑上相关的函数签名,作为各组件暴露其函数集合的一种契约。若在ASP.NET页中实现某个接口,要在<script>区段中定义所需的方法和属性。@Implements指令的语法如下所示:
1 <%@ Implements interface="InterfaceName" %>
一个页面中可以出现多个@Implements属性,另外注意,如果使用单独的代码隐藏文件则要将接口定义与代码隐藏文件中而不能定义于.aspx页面中。
@Reference指令
@Reference指令用于建立当前页与指定也或用户控件的动态链接。该功能在跨页面通信方面发挥着重大作用。我们可以通过它来创建用户控件的强类型实例。@Reference指令可以在页面中出现多次,并有两个互斥的属性:Page和Control。其使用方式:
1 <%@ Reference page="source_page" %> 2 <%@ Reference control="source_user_control" %>
以上两种方式中属性都只接受相对路径,且它们都不支持跨站点调用。在ASP.NET2.0以上版本后,只有control还常被用来引用控件到页面,使用page实现的页面数据传递的功能被跨页投递实现(@PreviousPageType)。