代码改变世界

【Asp.net从零开始】:使用母版页(Master Pages) (一)

2012-08-09 09:05  ATP_  阅读(2162)  评论(0编辑  收藏  举报

   一.母版页概述   

      使用 ASP.NET 母版页可以为应用程序中的页创建一致的布局。单个母版页可以为应用程序中的所有页(或一组页)定义所需的外观和标准行为。然后可以创建包含要显示的内容的各个内容页。当用户请求内容页时,这些内容页与母版页合并以将母版页的布局与内容页的内容组合在一起输出。

      母版页为一个单独的.master文件,文件内容与普通的.aspx大致相同,只有一些特殊的区别:

  1.母版页中使用@Master代替了普通内容页的@Page,而其中的指令大致相同。

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

  2.除会在所有页上显示的静态文本和控件外,母版页还包括一个或多个 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>Master page 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>

  ContentPlaceHolder控件实际上就是为内容页限定了其可以自定义修改的范围,在内容页中以Content控件来承接母版页中的ContentPlaceHolder,产生一一对应的关系,然后在ContentHolder控件所限定的范围内进行内容编辑。承接的代码示例: 注意:内容的所有内容都必须在Content控件内!!

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

从MSDN上找的一个图片示例,表示母版页ContentPlaceHolder与内容页Content一一对应的关系:

 MasterPagesMerge 图形

   二.使用母版页的优点:   

母版页提供了开发人员已通过传统方式创建的功能,这些传统方式包括重复复制现有代码、文本和控件元素;使用框架集;对通用元素使用包含文件;使用 ASP.NET 用户控件等。母版页具有下面的优点:

  • 使用母版页可以集中处理页的通用功能,以便可以只在一个位置上进行更新。

  • 使用母版页可以方便地创建一组控件和代码,并将结果应用于一组页。例如,可以在母版页上使用控件来创建一个应用于所有页的菜单。

  • 通过允许控制占位符控件的呈现方式,母版页使您可以在细节上控制最终页的布局。

  • 母版页提供一个对象模型,使用该对象模型可以从各个内容页自定义母版页。

 

   三.母版页运行时行为:   

在运行时,母版页是按照下面的步骤处理的:

  1. 用户通过键入内容页的 URL 来请求某页。
  2. 获取该页后,读取 @ Page 指令。如果该指令引用一个母版页,则也读取该母版页。如果这是第一次请求这两个页,则两个页都要进行编译。
  3. 包含更新的内容的母版页合并到内容页的控件树中。
  4. 各个 Content 控件的内容合并到母版页中相应的 ContentPlaceHolder 控件中。
  5. 浏览器中呈现得到的合并页。

    注:母版页成为了内容页的一部分。实际上,母版页与用户控件的作用方式大致相同 -- 作为内容页的一个子级并作为该页中的一个容器。但是在这种情况下,母版页是所有呈现到浏览器中的服务器控件的容器。

       四.限定母版页的范围   

    可以在三种级别上将内容页附加到母版页:

    • 页级   可以在每个内容页中使用页指令来将内容页绑定到一个母版页,如下面的代码示例中所示。  

      <%@ Page Language="C#" MasterPageFile="MySite.Master" %> 
      
    • 应用程序级   通过在应用程序的配置文件 (Web.config) 的 pages 元素中进行设置,可以指定应用程序中的所有 ASP.NET 页(.aspx 文件)都自动绑定到一个母版页。该元素可能看起来类似于下面这样。

      <pages masterPageFile="MySite.Master" />
      

      如果使用此策略,则应用程序中的所有具有 Content 控件的 ASP.NET 页都与指定的母版页合并。(如果某个 ASP.NET 页不包含 Content 控件,则不应用该母版页。)

    • 文件夹级   此策略类似于应用程序级的绑定,不同的是只需在一个文件夹中的一个 Web.config 文件中进行设置。然后母版页绑定会应用于该文件夹中的 ASP.NET 页。