MOSS中有两种页面:Site Pages 和Application Pages,他们分别使用不同的母版页,Site Pages 使用的是
Default.master, Application Pages使用的是Application.master。我们下面讨论的主要是针对
default.master的,因为Application.master是不支持被定制的。
Default.master在安装目录的C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\GLOBAL\目录下,站点中引用的相对路径为/_catalogs/masterpage/default.master。MOSS中
母版页是可以嵌套的:<%@ Master master=MyParent.master %>。不能添加webpart区域,但可以添加静
态的wetpart 。
该母版页中主要有以下几部分:
1. 链接,菜单,图标和导航控件。
MOSS已经给我们提供了很多封装好的控件,比如SPWebPartManager,导航的控件等等。
2. 占位符(Named Placeholds)
我们可以利用占位符来给继承自Default.master的页面添加内容,下面会有例子。
3. Delegate controls
这个词就不翻译了,使用它可以替换掉母版页中的内容。
下面是Default.master中的一段代码:
%@Master language="C#"%
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls"
Assembly="Microsoft.SharePoint, …" %>
<HTML runat="server">
<HEAD runat="server">
<!-- SharePoint 控件-->
<SharePoint:CssLink ID="CssLink1" runat="server"/>
<SharePoint:Theme ID="Theme1" runat="server"/>
<SharePoint:ScriptLink language="javascript" name="core.js" Defer="true" runat="server"/>
<!-- Named Placeholders -->
<Title ID=onetidTitle>
<asp:ContentPlaceHolder id=PlaceHolderPageTitle runat="server"/>
</Title>
<asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead" runat="server"/>
<!-- Named Delegate Control -->
<SharePoint:DelegateControl ID="DelegateControl1" runat="server" ControlId="AdditionalPageHead"
AllowMultipleControls="true"/>
</HEAD>
Head中的CssLink 和Theme,ScriptLink都是moss中标准的服务器控件,这两个控件在application.master中也是有的.
Head中有两个Named Placeholders,ID 分别为PlaceHolderPageTitle 和 PlaceHolderAdditionalPageHead,
PlaceHolderPageTitle表示页面的标题,PlaceHolderAdditionalPageHead表示页面的Head区域,你可以添加类似
<meta>的标签,示例如下:
<%@ Page MasterPageFile="~masterurl/default.master" %>
<asp:Content ID="PageTitle" runat="server" ContentPlaceHolderID="PlaceHolderPageTitle">
My Custom Page Title
</asp:Content>
<asp:Content ID="AdditionalPageHead" runat="server" ContentPlaceHolderID="PlaceHolderAdditionalPageHead">
<META name="keywords" content="Software, Consulting, Money, Fame" />
</asp:Content>
下面是MOSS中已定义的Named placeholds
占位符的Name |
描述 |
PlaceHolderAdditionalPageHead | 需要写在页面<head>标签里的附加内容,如引用的脚本或样式文件 |
PlaceHolderBodyAreaClass | 附加在页面顶部的body中的样式 |
PlaceHolderBodyLeftBorder | 页面body的边框元素 |
PlaceHolderBodyRightMargin | 页面body的右边距 |
PlaceHolderCalendarNavigator | 在页面中有日历时为其显示一个日期选择框 |
PlaceHolderFormDigest | 这是页面中必备的 "form digest"安全组件 |
PlaceHolderGlobalNavigation | 站点导航 |
PlaceHolderHorizontalNav | 导航标签 |
PlaceHolderLeftActions | 左侧导航区下面的动作区 |
PlaceHolderLeftNavBar | 左侧导航区 |
PlaceHolderLeftNavBarBorder | 左侧导航区的边框元素 |
PlaceHolderLeftNavBarDataSource | 左侧导航区菜单的数据源 |
PlaceHolderLeftNavBarTop | 左侧导航区上面的导航区 |
PlaceHolderMain | 页面主体 |
PlaceHolderMiniConsole | 一个放置页面级命令的地方,比如在WIKI站点里的Edit Page, History, Incoming Links |
PlaceHolderNavSpacer | 左侧导航区的宽度 |
PlaceHolderPageDescription | 页面描述区 |
PlaceHolderPageImage | 页面左上的图标 |
PlaceHolderPageTitle | 页面的<Title>,通常显示在浏览器的标题栏 |
PlaceHolderSearchArea | 搜索框 |
PlaceHolderSiteName | 站点名称 |
PlaceHolderTitleAreaClass | TitleArea附加的样式 |
PlaceHolderTitleAreaSeparator | TitleAreaSeparator区 |
PlaceHolderTitleBreadcrumb | TitleBreadcrumb区 |
PlaceHolderTitleInTitleArea | Breadcrumb区下面的标题 |
PlaceHolderTitleLeftBorder | Title区左侧边框 |
PlaceHolderTitleRightMargin | Title区右侧空白 |
PlaceHolderTopNavBar | 标签导航区 |
PlaceHolderUtilityContent | 页面底部需要的一块特殊内容 |
SPNavigation | 在 Windows SharePoint Services中默认为空,用于附加的页面编辑控件 |
WSSDesignConsole | 页面编辑控件,当页面进入编辑页面模式时使用(当我们点 Site Actions, Edit Page后) |
导航组件:
MOSS提供了很多标准的导航组件,如NavigationProvider, SPSiteMapProvider, SPContentMapProvider, 和SPXmlContentMapProvider,所有被激活的你都可以在站点的web.config的siteMap节点中配置,示例如下:
<siteMap defaultProvider="CurrentNavSiteMapProvider" enabled="true"> <providers> <add name="SPNavigationProvider" type="Microsoft.SharePoint.Navigation.SPNavigationProvider,
Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" /> </providers> </siteMap>
顶部链接栏和快速启动菜单是Default.master 中定义的两个主导航组件。顶部链接栏是即AspMenu。它由数据
源为SiteMapDataSource 控件的 SPNavigationProvider的定义的。快速启动和顶部链接栏是以同样的方式定义
的,他们之间的区别是顶部链接的SiteMapDataSource中的StartingNodeUrl属性使用值为 sid:1002,而快速启
动菜单对应的StartingNodeUrl 属性值为 sid:1025。1002和1025是用于跟踪导航节点的,顶部链接的顶部节点的
id是1002,快速启动的顶部节点的id为1025。
顶部链接和快速启动的节点的添加也是非常方便的,在后台的"网站设置"即可以灵活的设置.也可以使用MOSS对
象模型来填加,示例代码如下:
SPWeb site = (SPWeb)properties.Feature.Parent; SPNavigationNodeCollection topNav = site.Navigation.TopNavigationBar; // 创建下拉菜单SPNavigationNode DropDownMenu1; DropDownMenu1 = new SPNavigationNode("SitePages", "", false); topNav[0].Children.AddAsLast(DropDownMenu1); // 添加节点 DropDownMenu1.Children.AddAsLast(new SPNavigationNode("Page1","SitePages/Page1.aspx")); DropDownMenu1.Children.AddAsLast(new SPNavigationNode("Page2","SitePages/Page2.aspx"));
Delegate Controls
我们可以设置它影响的范围,有四个级分别是:site scope, site collection scope, Web application scope, 和
farm scope。下面我们就以MOSS中的搜索栏为例说明,下面是MOSS中默认的:
<SharePoint:DelegateControl ID="DelegateControl5" runat="server" ControlId="SmallSearchInputBox" />
MOSS中使用名为ContentLightup的feature来实现这功能的,SearchArea.xml中对应的代码为:
<Control Id="SmallSearchInputBox" Sequence="100" ControlSrc="~/_controltemplates/searcharea.ascx" />
下面我们就用我们自己定制的搜索栏来替默认的,我们就需要在我们自定义的feature中做如下设置:
<Control Id="SmallSearchInputBox" Sequence="10" ControlSrc="~/_controltemplates/OurSearchArea.ascx" />
在这里要注意一点,Sequence属性的值一定要小于默认提供的,这个Sequence的值在wss中是100,在moss
标准版中是50,企业版是25。这个你可以去MOSS的安装目录下搜索feature中对应的xml文件来核对(名字:
SearchArea.xml)。由于我们定义的这个是站点的级别的,那么你整个站点页面中的搜索控件都会被替换为
你自己定制的样式。
下面就是我们自定义的搜索样式的页面.ascx代码:
<%@ Control Language="C#" %>
<script runat="server">
protected void OurSearchArea_Click(object sender, EventArgs e)
{ }
</script>
<table>
<tr><td><asp:Button ID="cmdRunSearch" runat="server" Text="Search" OnClick="OurSearchArea_Click" /></td>
<td><asp:TextBox ID="txtSearchText" runat="server" Width="120" /></td></tr>
</table>
下图是替换的效果:
上面我们使用了用户控件方式(.ascx),我们还可以使用控件类的方式来自定义,下面是MOSS提供的标准的
QuickLaunchDataSource.
<SharePoint:DelegateControl ID="DelegateControl8" runat="server" ControlId="QuickLaunchDataSource"> <Template_Controls> <asp:SiteMapDataSource SiteMapProvider="SPNavigationProvider" ShowStartingNode="False" id="QuickLaunchSiteMap" StartingNodeUrl="sid:1025" runat="server" /> </Template_Controls> </SharePoint:DelegateControl>
这个DelegateControl 使用QuickLaunchDataSource控件来填充他的内容,并不是asc.aspx用户控件的
方式。他默认使用了id为QuickLaunchSiteMap的SiteMapDataSource控件,如果你想替换这个控件,你
可以在feature中添加一下代码
<Control Id="QuickLaunchDataSource" Sequence="1" ControlAssembly="System.Web, ..."
ControlClass="System.Web.UI.WebControls.SiteMapDataSource">
<Property Name="ID">QuickLaunchSiteMap</Property>
<Property Name="SiteMapProvider">SPSiteMapProvider</Property>
<Property Name="ShowStartingNode">False</Property>
</Control>
这个Control的id要和你要替换的id是一样的才可以。
自定义Default.master
我们可以使用SPD来定制母版页,母版页和其他的Site Page的原理是一样的,你定制过后就会被存到内容数
据库中。所以我们不要去文件目录下直接修改default.master文件,修改了也是没有用的。
下面我们就自定义一个母版页实现简单的换肤功能,在elements.xml中定义如下:
<Module Name="MasterPages" List="116" Url="_catalogs/masterpage"> <File Url="OurCustom.master" Type="GhostableInLibrary" />
</Module>
Url:"_catalogs/masterpage"是母版页的相对路径。
Type:"GhostableInLibrary" 会在文档库中存储该母版页。
List:属性代表不同的列表类型,下表是MOSS中已经定义的,微软建议我们自定义的最好大于10000,以避免
和已定义的冲突。
ID | Description |
100 | Generic list |
101 | Document library |
102 | Survey |
103 | Links list |
104 | Announcements list |
105 | Contacts list |
106 | Events list |
107 | Tasks list |
108 | Discussion board |
109 | Picture library |
110 | Data sources |
111 | Site template gallery |
112 | UserInformation |
113 | Web Part gallery |
114 | List template gallery |
115 | XML Form library |
116 | MasterPageCatalog |
117 | NoCodeWorkflows |
118 | WorkflowProcess |
119 | WebPageLibrary |
120 | Custom grid for a list |
130 | DataConnectionLibrary |
140 | WorkflowHistory |
150 | GanttTasks |
200 | Meeting Series list |
201 | Meeting Agenda list |
202 | Meeting Attendees list |
204 | Meeting Decisions list |
207 | Meeting Objectives list |
210 | Meeting text box |
211 | Meeting Things To Bring list |
212 | Meeting Workspace Pages list |
300 | Portal Sites list. |
301 | Posts |
302 | Comments |
303 | Categories |
1100 | Issue tracking |
1200 | AdminTasks |
2002 | Personal document library |
2003 | Private document library |
Page的MasterPageFile属性指定使用的母版页,MOSS中的母版页默认提供了一些token,主要有动态tokens ("~masterurl/default.master"
和"~masterurl/custom.master"
) 和静态 tokens ("~site/default
and
.master" "~sitecollection/default.master"
),说明如下:
Dynamic token "~masterurl/default.master"
可以通过SPWeb的MasterUrl
属性来指定网站的母版页的URL,即指定page中的
MasterPageFile,页面的<%@
中的
Page MasterPageFile="~masterurl\default.master"%>"~masterurl/default.master"
在运
SPWeb的
行时将会被MasterUrl
属性取代
Dynamic token "~masterurl/custom.master"
与上面的类似,他是通过SPWeb的CustomMasterUrl属性来指定的。
Static tokens "~site/default.master"
和"~sitecollection/default.master"
如果你的内容页在
http://siteColl/subsite1/subsite2/default.aspx
,你使用了静态tokens"~sitecollection/mypage.master"
, 你内容页使用的母版页在这个位置 http://siteColl/
. 如果你用的tokens 是
mypage.master"~site/mypage.master"
, 你的母版页就在这个位置 http://siteColl/subsite1/subsite2/mypage.master.
注意:MasterUrl 和 CustomMasterUrl 默认都是这个值"/_catalogs/masterpage/default.master" ,如果你要
改变的话,要两个都改变,必须一致才行。
下面我们就来实现动态设定母版页,由于我们定义的是站点级的,而站点中的每个子站点都是应用的自己独立
的一个master,所以我们使用递归来替换所有的站点的母版页代码如下:
protected void btnApplyOurCustomMaster_Click(object sender, EventArgs e)
{ SPWeb site = SPContext.Current.Site.RootWeb string MasterUrlPath = site.ServerRelativeUrl; if (!MasterUrlPath.EndsWith(@"/")) MasterUrlPath += @"/"; MasterUrlPath += @"_catalogs/masterpage/OurCustom.master"; ApplyCustomBrand(MasterUrlPath, site); } protected void ApplyOurCustomMaster(string MasterUrlPath, SPWeb site) { site.MasterUrl = MasterUrlPath; site.Update(); foreach (SPWeb child in site.Webs) { ApplyCustomBrand(MasterUrlPath, child); } }
下图是前后的效果: