2.5 使用Master Page
Master Page是ASP.NET 2.0中的一个新增特性,也是窍门程序变成产品特性的一个典型例子。Master Page的目的是定义一个由页面使用的布局模板。在应用程序中,并不是所有的页面都必须使用Master Page。可以让应用程序在不同的页面上使用多个Master Page,有时这是很理想的。Master Page可以定义一个或多个ContentPlaceHolder区域,这样内容页面就可以使用Master Page上提供的默认内容,或者覆盖它们,提供自己的内容。Web窗体页面使用Master Page特性,就变成了内容页面。内容页面仅提供在Master Page定义的ContentPlaceHolder中填充的内容。图2-6是一个定义了三个内容区域的Master Page示例。

图 2-6
在建立新的应用程序时,确定是否要使用Master Page的概念是很重要的。如果在开发循环的后期再决定,就必须修改每个页面,使之变成内容页面。
创建Master Page时,需要考虑由谁处理应用程序的外观和操作方式。我们定义的ContentPlaceHolder会影响布局的灵活性,所以必须仔细考虑站点可能使用的各种配置。
看看图2-6中显示的示例的HTML标记,注意这三个PlaceHolder控件都使用标准的HTML表,在页面上组织它们。图2-6显示了上一个范例的HTML标记。注意ContentPlaceHolder的名称分别是ContentPlaceHolder1、2和3。使用默认名称并没有什么错,但建议选择其他名称,以便更清晰地描述内容区域的用途。这将有助于查看内容页面的开发人员更好地理解该区域的用法。例如,上面的区域叫作ContentTopNav,在使用时会更清楚其用途。
<form id="form1" runat="server">
<div>
<table width="100%">
<tr>
<td colspan="2">
<asp:ContentPlaceHolder ID="ContentPlaceHolder1"
runat="server" />
</td>
</tr>
<tr>
<td width="200px">
<asp:ContentPlaceHolder ID="ContentPlaceHolder2"
runat="server" />
</td>
<td>
<asp:ContentPlaceHolder ID="ContentPlaceHolder3"
runat="server" />
</td>
</tr>
</table>
</div>
</form>
还可以在运行期间动态修改Master Page,进而动态修改站点的布局。详见第17章。
在使用Master Page时,我们的页面并没有继承Master Page,而是合并了Master Page,生成复合的输出页面。实际上,在页面类中,可以使用Page.Master属性访问活动的Master Page。默认情况下,这个属性是System.Web.UI.MasterPage类型。
可以在Master Page上添加定制的属性、方法和事件。使用下面的页面指令,可以修改属性的类型。下面的例子把Page.Master属性改为MVPHacks.BaseClasses.BaseMasterPage:
<%@ MasterType TypeName="MVPHacks.BaseClasses.BaseMasterPage" %>
或者
<%@ MasterType VirtualPath="~/Masters/SiteMaster.master" %>
如果Master Page的类型与MasterType指令上指定的类型不符,就会产生一个错误。例如,如果Master Page上有一个属性ActiveProductID,就可以使用强类型化的名称访问它,如下面的例子所示:
this.Master.ActiveProductID=50;







