ASP.NET 控制页概览

ASP.NET 控制页允许你为应用程序中的页面创建一致的布局。单个控制页中包含了为应用程序所有页面(或者一组页面)所定义的外观、感觉、以及标准行为。然后可以根据需要而分别创建单独的内容页。当用户对内容页进行请求时,内容页会合并到控制页中,并与控制页联合产生单一的页面输出。

控制页如何工作

控制页实际是由两个部分组成,即控制页本身和一个或多个内容页。

提示:你也可以对控制页进行嵌套使用。详细内容,请参考“嵌套的 ASP.NET 控制页”。

控制页

一个控制页就是一个扩展名为 .master 的 ASP.NET 文件(例如,MySite.master),它包含有预定义的网站布局,并且允许包括静态文本内容、HTML 元素、以及服务器控件。控制页使用特定的 @ Master 指令取代 .aspx 页面中的 @ Page 指令对文件进行标识。该指令示例如下。

<%@ Master Language="C#" %>

@ Master 指令可以使用 @ Control 指令中的大部分参数。例如,下例控制页的指令包括了代码分离文件的名称,并且为控制页指派一个类名称。

<%@ Master Language="C#" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>

除了 @ Master 指令之外,控制页也可以包含所有页面中的顶级 HTML 元素,如 htmlhead、以及 form。例如,你可能需要在控制页中使用一个 HTML 表格来进行布局的定义、为公司的标志图案使用 img 元素、为版权声明使用静态的文本内容、以及创建标准网站导航的服务器控件。你甚至可以使用任何一个 HTML 或 ASP.NET 元素作为控制页中的组成部分。

可替换的内容占位器

除了显示在所有页面中的静态文本内容和控件之外,控制页中也可以包括一个或多个 ContentPlaceHolder 控件。这些占位器控件定义了用显示可替换内容的显示区域,而可替换内容则被定义在内容页中。下例是定义了 ContentPlaceHolder 控件之后的控制页实例。

<%@ Master Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 
    1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server" >
    <title>控制页标题</title>
</head>
<body>
    <form id="form1" runat="server">
        <table>
           <tr>
               <td><asp:contentplaceholder id="Main" runat="server" /></td>
               <td><asp:contentplaceholder id="Footer" runat="server" /></td>
           </tr>
        </table>
    </form>
</body>
</html>
内容页

在创建单独的内容页时你需要对控制页占位器控件中的内容进行定义,这同样适用于 ASP.NET 页面(.aspx 文件以及可选的代码分离文件),这些文件必须与特定的控制页进行绑定。绑定操作通过在内容页的 @ Page 指令中使用 MasterPageFile 参数来对被使用的控制页进行定位。例如,某个内容页中可能使用下例 @ Page 指令与 Master1.master 进行绑定。

<%@ Page Language="C#" MasterPageFile="~/MasterPages/Master1.master" Title="Content Page"%>

在内容页中,你可以添加 Content 控件来创建内容,该控件被映射到控制页中的 ContentPlaceHolder 控件。例如,控制页可能拥有名为 Main 和 Footer 的两个内容占位器。在内容页中,你可以创建两个 Content 控件,一个映射到 ID 为 Main 的 ContentPlaceHolder 控件,而另一个映射到 ID 为 Footer 的 ContentPlaceHolder 控件,如下图所示。

替换占位器的内容

ASP.NET 控制页的合并过程

在创建 Content 控件之后,你就可以在其中添加文本内容和控件了。在内容页中,位于 Content 控件(除了运行在服务器端的脚本定义)之外的任何事物都会导致出现错误。跟 ASP.NET 页面一样,你可以在内容页中完成任何任务。例如,你可以使用服务器控件、数据库查询或其他动态机制来生成 Content 控件中的内容。

下例代码是某个内容页的定义。

<% @ Page Language="C#" MasterPageFile="~/Master.master" Title="内容页 1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Main" Runat="Server">
    主要内容。
</asp:Content>
    
<asp:Content ID="Content2" ContentPlaceHolderID="Footer" Runat="Server" >
    页脚内容。
</asp:content>

@ Page 指令将内容页与指定的控制页进行绑定,它为将被合并到控制页中的页面定义标题。注意:内容页不能够在 Content 控件之外包含任何标记和内容。控制页必须包含一个指定了 runat="server" 参数的 head 元素,这样页面标题的设定才能够在运行时被合并到控制页中。

你可以创建多个控制页来为网站的不同部分定义不同的布局,并且为每一个控制页定义不同的内容页。

控制页的优势

在传统的开发过程中,开发者所做的任务大多效率不高,他们需要分别对现有代码、文本内容、以及控件元素进行拷贝以创建新的文件,或者为了统一布局而使用框架集;为公共元素使用包含文件;自定义各种 ASP.NET 用户控件;等等。控制页的出现改变了这一局面,下面列出使用控制页时的优势:

  • 它们允许你对页面的公共功能进行汇集,所以你只需要在一个位置进行更改就能够在多个页面中更新。

  • 它们简化了控件集、页面集、以及代码的创建。例如,你可以在控制页中使用控件来创建应用于所有页面的菜单。

  • 它们赋予你超出最终页面布局之上的细节控制,以允许你对占位器控件的呈现方式进行控制。

  • 它们提供了一个允许你从单独内容页中对控制页进行自定义的可编程对象模型。

控制页的运行时行为

控制页在运行时将按照下列顺序进行处理:

  1. 用户通过输入内容页的 URL 来发送页面请求。

  2. 当页面已得到,将读取 @ Page 指令。如果指令中对控制页进行了引用,那么控制页也将会被读取。如果该页面是第一次被请求,那么它将与控制页一起被编译。

  3. 内容已更新的控制页被合并到内容页的控件树中。

  4. 单独的 Content 控件内容会与控制页中相应的 ContentPlaceHolder 控件内容进行合并。

  5. 将被合并的结果页面呈现给浏览器。

该处理过程如下图所示。

运行时的控制页

ASP.NET 控制页的合并过程

从用户的观点来看,被组合的控制页和内容页都是单独的,离散的页面。页面的 URL 实际上指的是内容页的 URL。

从编程的观点来看,两个页面分别为各自的控制而扮演了容器的角色。内容页扮演的是控制页的容器。但是,你可以从内容页的代码中对公共控制页的成员进行引用,下面的部分将进行描述。

要注意的是,在控制页成为内容页的一部分之后。如果有效,那么控制页会扮演与大多数用户控件相同的角色,即成为内容页的子控件以及内容页的容器。但是,在这种情况下,控制页是作为所有服务器控件的容器被呈现到浏览器的。被合并的控制页和内容页中的控件树可能像这样:

Page
    Master Page
        (Master page markup and controls)
        ContentPlaceHolder
            Content page markup and server controls
        (Master page markup and controls)
        ContentPlaceHolder
            Content page markup and server controls
        (Master page markup and controls)

该图是已经被简化;即使内容页没有相应的 Content 控件,那么控制页的 ContentPlaceholder 控件中也允许存在标记和控件。

通常,这个结构不会对页面或程序的构造方式造成影响。但是,在有些情况下,如果你在控制页中设置了一个页面级属性,那么它将会影响到内容页的行为,那是因为控制页是页面中是最顶层的控件。例如,如果你在内容页中设置属性 EnableViewState 的值为 true,而在控制页中设置该属性的值为 false,那么视图状态将会受到影响从而被禁用,因为控制页中的设定拥有更高的优先权。

控制页和内容页的路径

当某个内容页被请求时,它的内容会与控制页进行合并,并且页面运行在内容页的上下文空间里。例如,如果你获得了 HttpRequest 对象的 CurrentExecutionFilePath 属性,那么,不论是在内容页代码中还是在控制页代码中,该路径展示的始终是内容页的位置。

控制页和内容页不一定要同时被保存在相同的目录中。只要内容页的 @ Page 指令的 MasterPageFile 参数指向有效的控制页路径,ASP.NET 就能够把内容页和控制页合并成一个单独呈现的页面。

外部资源的引用

内容页和控制页中都可以包含对外部资源进行引用的控件和元素。例如,可以包含引用图片文件的图片控件,或者是包含引用到其他页面的超级链接。

因为被合并内容和控制页使用的都是内容页的上下文空间。所以有可能对资源 URL 的指向产生影响,如图片文件和目标文件的超级链接。

服务器控件

在控制页的服务器控件中,ASP.NET 会对引用外部资源的 URL 进行动态更改。例如,你可能在控制页中放置了一个 Image 控件,并且它的 ImageUrl 属性值被设置成相对于该控制页的路径。在运行时,ASP.NET 就会把 URL 更改成与内容页面上下文空间中相一致的正确路径。

ASP.NET 在下列情况下会对 URL 进行更改:

  • 当 URL 是某个 ASP.NET 服务器控件的属性时。

  • 当该属性在控件内部被标记为 URL(该属性与 UrlPropertyAttribute 一起被标记)属性时。在实际情况中,ASP.NET 服务器控件属性通常是通过这样的方式对外部资源的引用进行标记的。

其他元素

ASP.NET 不可以更改非服务器控件元素中的 URL。例如,如果你在控制页中使用了一个已设置 src 参数的 img 元素,ASP.NET 将不会更改该参数的值,参数值将会在当前内容页的上下文环境中解析并被创建。

通常,在控制页中使用元素的时候,建议你使用服务器控件,那些不需要编写服务器代码的普通元素也是一样。例如,作为使用 img 元素的替代,我们使用一个 Image 服务器控件。那么,ASP.NET 就会对 URL 完成正确的解析,并且你也可以避免在移动控制页或内容页时的出现链接维护问题。

更多关于 ASP.NET 服务器控件路径的信息,请参考“ASP.NET 网站路径”。

控制页和主题

你不可以直接在控制页中使用 ASP.NET 主题。如果你在 @ Master 指令中添加了主题参数,那么该页面在运行时将会出现一个错误。

但是,在下列特定环境中是可以把主题应用到控制页的:

  • 如果主题被定义在内容页中。因为控制页会被解析成内容页的上下文空间中的一部分,所以内容页的主题可以在控制页中得到应用。

  • 如果配置文件的 Pages 元素(ASP.NET 设定大纲)中包括了应用于整个网站的主题定义。

更多信息,请参考“ASP.NET 主题和皮肤概览”。

控制页的应用范围

你可以实现三个应用级别的内容页和控制页的绑定操作:

  • 页面级别

    你可以在每一个内容页中使用 @ Page 指令把内容页绑定到控制页,如下例代码所示。

    <%@ Page Language="C#" MasterPageFile="MySite.Master %>
    
  • 应用程序级别

    通过对应用程序配置文件(Web.config)中的页面元素的设定进行标记,你可以为应用程序中所有 ASP.NET 页面(.aspx 文件)指定要进行绑定的控制页。该元素如下例代码所示。

    <pages masterPageFile="MySite.Master" />
    

    如果你使用这个策略,那么应用程序中所有包含 Content 控件的 ASP.NET 页面都会与特定的控制页进行合并。如果某个 ASP.NET 页面没有包含 Content 控件,那么控制页将无法应用于该页面。

  • 目录级别

    这个策略有点像应用程序级别的绑定,不同的是你只能够对一个目录中的 Web.config 文件进行设定。这时候的控制页绑定会应用于该目录中的所有 ASP.NET 页面。

转载于:https://www.cnblogs.com/Laeb/archive/2006/12/26/604176.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值