母版页(Master Pages)


  ASP.NET 1.x中最突出的缺点之一是它缺少对页面模板的支持。欠缺的是定义其他页面可以继承的“母版页”能力。开发人员通过使用用户控件(它们可以容易地在页面之间复制)创建页面来弥补这一缺陷。在ASP.NET 2.0中,由于加入了一个称作“母版页”的新增功能,所以不再需要这种技巧。想一想“可视化继承”,您就会理解母版页是干什么用的了。首先,您需要定义一个母版页(其中包含您希望在其他页面上显示的内容),并且使用ContentPlaceHolder控件来定义子页面可以将其内容插入的位置。然后,您需要生成子页面—SPX文件,它使用(类似于)如下所示的指令来引用母版页:


<%@ Page MasterPageFile="~/Foo.master" %>


  在子页面中,您使用Content控件来填写母版页中的占位符。在浏览器中呈现子页面,出现的内容将是在母版页和子页面中所定义内容的完美组合。


<%@ Master %>


<html>

<body leftmargin="0" topmargin="0" rightmargin="0"

bottommargin="0" marginheight="0" marginwidth="0"

<!-- Banner -->

<table cellspacing="0" cellpadding="0"

style="background-image: url('images/stripes.gif');

background-repeat: repeat-x, repeat-y" width="100%"

<tr><td align="center">

<span style="font-family: verdana; font-size: 36pt;

font-weight: bold; color: white"

Master Pages

</span><br>

<span style="font-family: verdana; font-size: 10pt;

font-weight: normal; color: white"

This banner provided by Master.master

</span>

</td></tr>

</table>


<!-- Placeholder for content between banner and footer -->

<form id="Content">

 <asp:ContentPlaceHolder ID="Main" RunAt="server" />

</form>


<!-- Footer -->

<table width="100%"><tr><td align="center">

<span style="font-family: verdana; font-size: 8pt; color: red">

Copyright (c) 2004 by Me Inc. All rights reserved<br>

This footer provided by Master.master

</span>

</td></tr></table>

</body>

</html>


Master.master


<%@ Page MasterPageFile="~/Master.master" %>


<asp:Content ContentPlaceHolderID="Main" RunAt="server">

<table width="100%" height="256px"><tr><td align="center">

<h2>This content provided by Subpage.aspx</h2>

</td></tr></table>

</asp:Content>


代码1 Subpage.aspx

  代码1中所示的应用程序使用母版页来定义出现在每个页面上的页眉和页脚。子页面通过将Content控件插入母版页的ContentPlaceHolder中,从而在页眉和页脚之间插入内容。您应该注意匹配的ID和ContentPlaceHolderID,以及母版页中的@ Master指令。


  母版页在ASP.NET对象模型中得到了充分支持。System.Web.UI.Page类的特点是具有一个名为Master的新属性,该属性使子页面可以用编程方式来引用它的母版页以及在其中定义的控件。母版页可以嵌套,并且可以包含能够在子页面中重写的默认内容。


<asp:ContentPlaceHolder ID="Main" RunAt="server">

 This is default content that will appear in subpages unless explicitly overridden

</asp:ContentPlaceHolder>

  此外,应用程序可以在Web.config中指定默认的母版页,如下所示:


<configuration>

<system.web>

 <pages masterPageFile="~/Foo.master" />

</system.web>

</configuration>

  单个子页面享有重写默认母版页和指定它们自己的母版页的自由。


  最精彩的部分是Visual Studio 2005中对母版页的支持。当加载子页面时,IDE将显示母版页中定义的内容的灰色、只读版本,以及子页面中定义的内容的全色、完全可编辑版本。区分这两者很容易,并且如果要编辑属于母版页的内容,那么您需要做的全部事情只是在IDE中打开母版页。


  有关母版页的更多深入内容,请参阅相关的文章。