随笔 - 235, 文章 - 12, 评论 - 1671
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

MOSS点滴(3):说说MOSS中的母版页

Posted on 2008-04-25 21:15  生鱼片  阅读(4744)  评论(10编辑  收藏

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>

下图是替换的效果:
05 
 
上面我们使用了用户控件方式(.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);
  }
}
下图是前后的效果:
06