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
.master" and "~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/
mypage.master. 如果你用的tokens 是"~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);
}
}
下图是前后的效果:
本blog文章如无特殊说明,均属原创,转载请注明出处。