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

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站点名称
PlaceHolderTitleAreaClassTitleArea附加的样式
PlaceHolderTitleAreaSeparatorTitleAreaSeparator区
PlaceHolderTitleBreadcrumbTitleBreadcrumb区
PlaceHolderTitleInTitleAreaBreadcrumb区下面的标题
PlaceHolderTitleLeftBorderTitle区左侧边框
PlaceHolderTitleRightMarginTitle区右侧空白
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是一样的才可以。
 

我们可以使用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
100Generic list
101Document library
102Survey
103Links list
104Announcements list
105Contacts list
106Events list
107Tasks list
108Discussion board
109Picture library
110Data sources
111Site template gallery
112UserInformation
113Web Part gallery
114List template gallery
115XML Form library
116MasterPageCatalog
117NoCodeWorkflows
118WorkflowProcess
119WebPageLibrary
120Custom grid for a list
130DataConnectionLibrary
140WorkflowHistory
150GanttTasks
200Meeting Series list
201Meeting Agenda list
202Meeting Attendees list
204Meeting Decisions list
207Meeting Objectives list
210Meeting text box
211Meeting Things To Bring list
212Meeting Workspace Pages list
300Portal Sites list.
301Posts
302Comments
303Categories
1100Issue tracking
1200AdminTasks
2002Personal document library
2003Private 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);
  }
}
下图是前后的效果:
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值