第
160
章
MasterPage
自引入Internet以来,使网站有统一的外观和操作方式是开发人员一直试图解决的一个
问题.大多数网站都有标题,脚标和菜单结构,但它们对放置其中的各个项目的处理方式不同.多年来,产生了几个不同的技术来解决这个问题,例如服务器端的include文件,层叠样式表(
CSS),定制模板文件,XML和XSLT,以及最近的ASP.
NET用户控件等.这些技术都有其优缺点,但没有一种技术提供了使网站保持一致的解决
方案.在ASP.NET1.1中,用户控件(和CSS)提供了使网站布局保持一致的最佳方案,因为它们是面向对象的,可以定义一个或多个页面上的通用标题,脚标和菜单.但是,大多数开发人员都要在每个页面上使用Reference指令以及相关的TagPrefix和TagName特性,来引用用户控件,导致代码的重复.为了解决这些重复代码的问题,一些开发人员尝试把用户控件嵌入其他用户控件中.这个方式的确有效,但在加载或回送操作中需要编程访问控件时,嵌套的对象模型很难使用.为解决这个问题,人们开发出了面向ASP.NET1.1的几个不同模板框架,以最大限度地减少Web开发人员修改标题,脚标,菜单和网站上其他公共部分的布局所需的
工作量.最初,.NET模板框架依赖扩展了System.Web.UI.Page类的定制类.这些定制类常常把站点的公共
HTML元素(例如标题,脚标)硬编码到类中,加大了维护和部署的难度.其他解决方案扩展了PageBase类,但在一个外部模板文件中定义网站的公共布局组件.这类模板框架的例子可以在
xmlforasp.net/codeSection.aspx?csID=102上找到.定制模板框架完成了这个任务,但在VisualStudio.NET中没有提供
设计期间的支持,也没有为.NET开发人员提供一种标准方式来定义网站的整体结构.推出ASP.NET2.0后,技术水平不同的Web开发人员就有了一种新方式,可以为网站提供统一的布局和结构.该方式不是采用嵌套的用户控件,定制类和模板,而是使用ASP.NET2.0的MasterPage定义网站的整体布局,且所花的时间和精力非常少.它们可以在一个地方定义,在整个网站上共享,且不需要把标题,脚标和菜单用户控件硬编码到每个页面上.本章将介绍MasterPage,描述可以在ASP.NET2.0网站上使用的各种技巧.前两节概述MasterPage的创建和使用,其后的章节深入探讨MasterPage的用法.
16.1
MasterPage基础
MasterPage提供了一种简单而高效的模板框架,它允许在一个模板文件中定义网站的
ASP.NET2.0编程珠玑公共组件,例如菜单,标题和脚标.这将快速而轻松地修改网站的整体外观,操作方式和布局,因为对MasterPage模板的修改会自动应用于整个网站.许多网站都只需要一个MasterPage,但也可以根据需要创建多个MasterPage——一个用于主页,一个用于子页面.MasterPage也可以根据用户的配置或其他条件动态加载.因此很容易提供页面的可打印版本,而无需修改页面的内容.所有的MasterPage都有.master扩展名,它映射到处理
程序System.Web.HttpForbiddenHandler上.这个映射在Web服务器的默认
web.config文件中定义,可以防止MasterPage直接在浏览器中打开,就好像带.ascx和.config扩展名的文件不能用浏览器查看一样.试图在浏览器中查看扩展名为.master的文件,会导致一个"这类页面不能打开"错误.MasterPage依赖.NETFramework中的已有类来执行其逻辑.它们直接派生自UserControl类:
publicclassMasterPage:System.Web.UI.UserControl
派生自UserControl的结果是,MasterPage有一组标准的属性,例如Page,Session,Request和Response,它们可以以编程方式访问.MasterPage不能在InternetInformationServices(IIS)应用程序(如用户控件)之间共享,否则会生成一个错误.本章的后面将
学习解决这个问题的一种方式,让MasterPage可以在服务器的多个IIS应用程序之间共享.
16.1.1
创建MasterPage
在VisualStudio.NET2005中,使用AddNewItem菜单就可以创建MasterPage,也可以在自己喜欢的文本编辑器中打开一个新文件,在文件的开头添加Master指令,手动创建MasterPage.简单的MasterPage如程序清单16-1所示.
程序清单16-1简单的MasterPage
<%@MasterLanguage="C#"AutoEventWireup="true"CodeFile="WebsiteMasterPage.master.cs"Inherits="WebSiteMasterPage"%>