页面的处理指令 页面指令的处理用于配置执行该页面的运行时环境。在ASP.NET中,指令可以位于页面的任何位置,但良好且常见的习惯是将其置于文件的开始部分。除此,页面指令的名称是不区分大小写的,且指令的属性(attribute)值也不必加引号。@Page是ASP.NET中最重要的也是最常用的指令。表3.4列出了所有ASP.NET指令。 【101~102】 表3.4 ASP.NET页面支持的指令
除@Page、 @PreviousPageType、@Master、@MasterType和@Control外,所有指令都可以在页面和控件中声明。@Page和 @Control是互斥的:@Page仅能用在.aspx文件中,而@Control指令仅能用在.ascx文件中。@Master用于定义一种非常特殊的页面——母版页(master page)。 处理指令的语法较特殊,但对于所有指令类型都是一致的。多个属性(attribute)必须用空白分割,属性与值间的等号(=)两边不能有空白,如下所示: <%@ Directive_Name attribute="value" [attribute="value" … ] %> 【103】 每种指令都有自己类型化的属性集合。将错误类型的值赋给一个属性,或在某个属性中使用错误的属性,都会导致编译错误。 要点:指令的属性内容总是以纯文本的形式被解析。然而,对于某些属性,应包含能够被解析为特定.NET Framework类型的值。当ASP.NET页面被解析时,所有指令属性 @Page指令 @Page指令只能在.aspx页面中使用,若在其他ASP.NET页(如控件和Web服务)中使用,会导致编译错误。每个.aspx文件最多只能包含一个@Page指令。虽然从语法的角度看,没有必要强制要求指定该指令,但实际几乎所有复杂的页都这样做。 @Page指令大约有30个属性,它们从逻辑上可以分为三类:编译(详见表3.5)、页面整体行为(详见表3.6)和页面输出(详见表3.7)。每个ASP.NET页在第一次请求时进行编译,实际发送给浏览器的HTML是类的方法生成的,而这些类也是动态生成的。表3.5所列的属性用于对编译器参数进行调整,并能够选择要使用的语言。 表3.5 用于页面编译的@Page指令属性
续表
【104~105】 注意,Explicit和Strict属性的默认值从应用程序的配置文件中读取。通过合并所有计算机级、应用程序级和文件夹级的设置,从而获得ASP.NET应用程序的设置。这表明我们还可以控制 Explicit和Strict属性的默认值。如果不更改默认的配置信息(即.NET Framework安装时创建的配置信息),Explicit和Strict便为默认设置true。如果在各配置文件中,删除与其相关的所有设置,二者的值都会变为false。 可通过表3.6列出的属性在某种程度上控制页的整体行为和支持的功能。例如,我们可以设置自定义的错误页、禁用会话状态,以及控制页面的事物处理行为。 表3.6 用于控制页面行为的@Page指令属性
续表
续表
【106~107】 表3.7中列举的属性用于控制为页面生成的输出信息格式。例如,我们可以设置页面的内容类型,或者尽可能地使输出本地化。 表3.7 用于控制输出的@Page指令属性
续表
不难看出,表3.7中的许多属性与页面的本地化有关。ASP.NET(更一般地讲是.NET Framework)极大地简化了构建多语言的国际化应用程序的任务。第5章会深入探讨该问题。 @Assembly指令 @Assembly指令用于将某个程序集链接到当前页面,使其类和接口可以在该页面上使用。在ASP.NET编译该页时,会有几个默认的程序集被链接进去。因此,只有在需要链接一个非默认程序集时,才应使用该指令。表3.8列出了自动提供给编译器的.NET程序集。 【108】 表3.8 默认链接的程序集
除这些程序集外,ASP.NET运行库还会自动将 Web应用程序Bin子目录中的程序集链接到所有页面上。通过编辑计算机级web.config文件中的设置,可以更改、扩展或限制默认的程序集列表。这种更改将作用于运行在该Web服务器上的所有ASP.NET应用程序。此外,还可以编辑应用程序特定的web.config文件,逐一对每个应用程序的程序集列表进行定制。为防止将Bin目录中存在的所有程序集都链接到页面,可以在根配置文件中删除以下代码: <add assembly="*" /> 【109】 警示:对于ASP.NET应用程序,整个配置属性集都在计算机级进行了设置。最初,服务器计算机上运行的所有应用程序共享相同的设置。独立的应用程序可以在其自身的web.config文件中重写其中的某些设置。每个应用程序可以在其根目录放置一个web.config文件,在应用程序特定的子目录下放置其他特殊化的web.config副本。每一页的设置取决于从计算机级到当前文件夹路径发现的所有配置文件中的全部设置。在ASP.NET 1.x中,machine.config文件包含完整的默认设置树。而在ASP.NET 2.0中,与Web应用程序有关的设置数据被移到了web.config文件中,与machine.config处于同一系统文件夹。该文件夹叫 CONFIG,位于ASP.NET安装路径下:%WINDOWS%\Microsoft. Net\Framework\[version] 。 要将所需程序集链接到页面,可使用如下语法: <%@ Assembly Name="AssemblyName" %> <%@ Assembly Src="assembly_code.cs" %> @Assembly指令支持两个互斥属性:Name 和Src。Name用于提示链接到页面的程序集名称。该名称不能包含路径和扩展名。Src用于指示要动态编译并链接到页面的源文件路径。 @Assembly指令可以在页面的主体部分出现多次。事实上,对于每个要链接的程序集来说,都需要分别添加指令。Name和Src不能同时在一个 @Assembly指令中使用,但对于页面中定义的不同指令,则可以分别选择。 提示:虽然 Name指向的是一个已存在的且准备加载的程序集,但Name与Src在性能方面的差别很小。使用Src引用的源文件只在首次被请求时编译一次。 ASP.NET运行库会将源文件与动态编译的程序集进行映射,并在源文件被更改前,一直使用已编译的代码。也就是说,在应用程序级的首次调用过后,无论使用Name还是Src,对页面性能的影响都是相同的。 @Import指令 @Import指令用于将指定的命名空间链接到页面,以便所有已定义类型可以在页面访问,而不必使用完全限定名(fully qualified name)。例如,为创建一ADO.NET DataSet类的实例,可以导入System.Data命名空间,也可以像下面这样使用完全限定名: System.Data.DataSet ds = new System.Data.DataSet(); 【110】 一旦将System.Data命名空间引入当前页,我们就可以像下面这样更自然地编写代码: DataSet ds = new DataSet(); @Import指令的语法是自描述的: <%@ Import namespace="value" %> @Import可以在页面主体中多次使用。 ASP.NET的@Import指令相当于C#的using语句,也相当于Visual Basic .NET的Import语句。回顾非托管的C/C++,可以说该指令所起的作用几乎与#include指令相同。 注意:@Import只能帮助编译器解析类的名称,并不会自动链接所需程序集。使用@Import指令可以缩短类的名称,但倘若包含该类的程序集未被正确地链接,会引发编译器的类型错误。如果程序集尚未被链接,使用“完全限定类名”也无济于事,因为编译器需要类型的定义。您可能已经注意到了,程序集和命名空间的名称往往是一致的。但请记住,这纯属巧合,程序集与命名空间是完全不同的实体,分别需要相应的指令。 例如,为连接SQL Server数据库并获取某些无连接数据,我们需要导入以下两个命名空间: <%@ Import namespace="System.Data" %> <%@ Import namespace="System.Data.SqlClient" %> 我们需要System.Data命名空间以便使用 DataSet和DataTable类,而通过System.Data.SqlClient命名空间来准备并发送命令。在这种情况下,我们不需要另外链接程序集,因为System.Data.dll程序集是默认链接的。 @Implements指令 @Implements指令用于指示当前页面实现的.NET Framework中的特定接口。接口是一组逻辑上相关的函数签名,作为各组件暴露其函数集合的一种契约。与抽象类(abstract class)不同,接口不提供代码或执行功能。若在ASP.NET页中实现某个接口,要在<script>区段中定义所需方法和属性。 @Implements指令的语法如下所示: <%@ Implements interface="InterfaceName" %> 【111】 如果页中需要实现多种接口,@Implements 指令可以在该页中出现多次。注意,如果决定将所有页的逻辑定义在单独的文件中,则不能使用该指令来实现接口,而要在代码隐藏类中进行。 @Reference指令 @Reference指令用于建立当前页与指定页或用户控件间的动态链接。该功能在跨页面通信方面发挥着重大作用。我们可通过它来创建用户控件的强类型实例。让我们来看一下它的语法。 @Reference指令可以多次出现在页面中,并有两个互斥属性:Page和Control。这两个属性都用于指定源文件的路径: <%@ Reference page="source_page" %> <%@ Reference control="source_user_control" %> Page属性用于指向某个.aspx源文件,而 Control属性包含的是.ascx用户控件的路径。在这两种情况下,被引用的源文件都会被动态编译进程序集中,如此一来,在编程时,可以在主动引用页面中使用源文件中定义的类。在运行时,ASP.NET页面是.NET Framework类的实例,带有由方法和属性组成的特定接口。当主动引用页面执行时,被引用页面变为表示.aspx源文件的类,可以按需要对其进行实例化和编码。注意,为使该指令发挥作用,被引用页面必须与主调页面处于一个域中。不允许跨站点调用,且Page和Control属性只接受相对虚拟路径。 |
相关文章
- 02-23为什么X86汇编中的mov指令不支持内存到内存的寻址?
- 02-23python – 将支持页面布局的水平线添加到ReportLab表布局
- 02-23【Computer Organization笔记16】大实验任务详细说明:支持指令流水的计算机系统设计与实现
- 02-23asp.net的服务器控件客户端空件的区别以及如何刷新页面不靠数据库数据停留在页面
- 02-23微信H5页面嵌入百度地图---解决手机的webKit定位,ios系统对非https网站不提供支持问题
- 02-23编译 – Pip安装 – 您选择的CPU不支持x86-64指令集
- 02-23ASP.NET MVC应用程序中支持用户使用腾讯QQ和微信以及新浪微博的第三方登录
- 02-23sysrq:最新@2021-08-31:支持的内核指令大全
- 02-23freemarker 的 include指令,引入另一个页面
- 02-23vue的页面指令和过滤器 详解