SharePoint 2010母版页所用的还是ASP.NET 2.0中的技术。通过该功能,实现了页面框架布局与实际内容的分离。虽然在本质上自定义母版页的过程和以前版本的SharePoint大致相同,但是从2007到2010仍然有许多重要的值得我们关注的变化。本文将试图:
- 巩固和掌握SharePoint 2010里母版页相关的一些基本操作
- 突出描述新版本和以前的版本之间的一些变化
- 了解一些有用的或比较常见的自定义方式
SharePoint 2010 母版页的类型
首先,让我们快速的看一下在SharePoint 2010中母版页的类型:
v4.master
默认的工作组站点的母版页。提供了功能区和其他用户界面上的改变。
特征
- 网站操作在2010中更新。现在放在左侧。
- 功能区可用。
default.master
从SharePoint 2007升级的网站使用该母版页,除非我们手工改成v4版本。
特征
- SharePoint 2007版本的 网站操作在右侧
- 没有功能区。
minimal.master
母版页中几乎什么也没有。通常用于搜索中心和Office Web应用程序的页面。这个母版页不应该与2007里的开发人员自己修剪下来的最简单的自定义母版页混淆。 minimal.master现在是一个开箱即用的母版页。在SharePoint 2010里那些修剪完的自定义母版页通常是指Starter母版页。
特征
Starter母版页
SharePoint 2007里通常称为minimal母版页。这些母版页往往是由开发人员创建的,用于快速开始母版页的定制,基于其上扩充功能,做出实际需要的母版页。
simple.master
这个母版页是用在登录和错误页面。要自定义该页面,必须替换存放在服务器_layouts目录下的相应页面文件。若要了解更多信息,请参考MSDN上的文章“SharePoint中的默认母版页”。
使用simple.master 的网页
- Login.aspx
- SignOut.aspx
- Error.aspx
- ReqAcc.aspx
- Confirmation.aspx
- WebDeleted.aspx
- AccessDenied.aspx
其他母版页
以下这些杂七杂八的母版页,在定制网站时一般不会去动。
包括:
- application.master
- applicationv4.master
- dialog.master
- layouts.master
- layoutsv3.master
- pickerdialog.master
- rtedialog.master
- simple.master simple.master
- simplev4.master
- mwsdefault.master
- mwsdefaultv4.master
- admin.master
- popup.master
升级至SharePoint 2010母版页
许多以前在菜单和工具栏里面的命令现在存放在功能区里。因此,如果现有的母版页中不包含功能区,许多命令将不可用。
功能区里的控件
SharePoint 2010里的下列控件放置在功能区里:
- 发布控制台- <PublishingConsole:Console>
- 网站操作菜单- <PublishingSiteAction:SiteActionMenu>
- 登录和登录控制(如果使用自定义登录,被移到功能区里了)。
所需内容占位符
PlaceHolder控件 |
描述 |
新增 |
<asp:ContentPlaceHolder id="PlaceHolderQuickLaunchTop" runat="server"> |
快速启动菜单顶部。 |
是 |
<asp:ContentPlaceHolder id="PlaceHolderQuickLaunchBottom" runat="server"> |
快速启动菜单底部。 |
是 |
<asp:ContentPlaceHolder id="PlaceHolderPageTitle" runat="server"/> |
该网站的标题。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderAdditionalPageHead" runat="server"/> |
页面head部分的占位符,用于在页面对应的HTML的head标记中添加额外例如ECMAScript(JavaScript,JScript)和层叠样式表(CSS)。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderBodyAreaClass" runat="server"/> |
在body区域中的类。 |
否 |
<asp:ContentPlaceHolder ID="SPNavigation" runat="server"> |
该控件用于放置页面编辑类的控件。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderSiteName" runat="server"> |
当前页面所在站点的名称。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderPageTitleInTitleArea" runat="server" /> |
出现在标题区域的当前页的标题。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderPageDescription" runat="server"/> |
当前页的说明。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderSearchArea" runat="server"> |
页面中放置搜索控件的位置。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderGlobalNavigation" runat="server"> |
页面上的面包屑控件。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderTitleBreadcrumb" runat="server"> |
面包屑控件上的面包屑文本。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderGlobalNavigationSiteMap" runat="server"> |
页面上子网站和兄弟网站的全局导航。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderTopNavBar" runat="server"> |
用于放置顶部导航栏的容器。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderHorizontalNav" runat="server"> |
顶部导航栏中的导航菜单。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderLeftNavBarDataSource" runat="server" /> |
放置填充左侧导航所需数据源的容器。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderCalendarNavigator" runat="server" /> |
日期选择器,用于包含日历的页面。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderLeftNavBarTop" runat="server"/> |
左侧导航栏顶部区域。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderLeftNavBar" runat="server"> |
快速启动栏。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderLeftActions" runat="server"> |
快速启动栏上的其他对象。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderMain" runat="server"> |
页面的主要内容。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderFormDigest" runat="server"> |
存储页面中 Form Digest控件的容器。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderUtilityContent" runat="server"/> |
附加在页面底部的内容在。从HTML角度来说,是Form标记以外的部分。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderTitleAreaClass" runat="server"/> |
title部分的类(现在是在head标记里)。对其定制时如果添加一个WebPartZone到这个palceholder会报错。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderPageImage" runat="server"/> |
不属于用户界面的组成部分,是为了向后兼容。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderTitleLeftBorder" runat="server"> |
不属于用户界面的组成部分,是为了向后兼容。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderMiniConsole" runat="server"/> |
不属于用户界面的组成部分,是为了向后兼容。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderTitleRightMargin" runat="server"/> |
不属于用户界面的组成部分,是为了向后兼容。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderTitleAreaSeparator" runat="server"/> |
不属于用户界面的组成部分,是为了向后兼容。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderNavSpacer" runat="server"> |
不属于用户界面的组成部分,是为了向后兼容。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderLeftNavBarBorder" runat="server"> |
不属于用户界面的组成部分,是为了向后兼容。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderBodyLeftBorder" runat="server"> |
不属于用户界面的组成部分,是为了向后兼容。 |
否 |
<asp:ContentPlaceHolder id="PlaceHolderBodyRightMargin" runat="server"> |
不属于用户界面的组成部分,是为了向后兼容。 |
否 |
添加功能区
功能区是用户界面里一个新增加的特性。 SPRibbonPeripheralContent控件会显示在这一区域,但如果需要也可以将其移到功能区外面。
步骤
复制并粘贴下面的代码到你的母版页。
01 |
< div id = "s4-ribbonrow" class = "s4-pr s4-ribbonrowhidetitle" > |
02 |
< div id = "s4-ribboncont" > |
03 |
< SharePoint:SPRibbon runat = "server" PlaceholderElementId = "RibbonContainer" CssFile = "" > |
04 |
< SharePoint:SPRibbonPeripheralContent runat = "server" Location = "TabRowLeft" CssClass = "ms-siteactionscontainer s4-notdlg" > |
05 |
< SPAN style = "BACKGROUND-COLOR: #ffff99" > <%-- 在这里插入网站操作菜单 --%> </ SPAN > |
06 |
</ SharePoint:SPRibbonPeripheralContent > |
07 |
< SPAN style = "BACKGROUND-COLOR: #ffff99" ><%-- 在这里插入全局导航 --%></ SPAN > |
08 |
< SharePoint:SPRibbonPeripheralContent runat = "server" Location = "TabRowRight" ID = "RibbonTabRowRight" CssClass = "s4-trc-container s4-notdlg" > |
09 |
< SPAN style = "BACKGROUND-COLOR: #ffff99" ><%-- 在这里插入右上角的控件 --%> </ SPAN > |
10 |
</ SharePoint:SPRibbonPeripheralContent > |
11 |
</ SharePoint:SPRibbon > |
13 |
< div id = "notificationArea" class = "s4-noti" > |
14 |
< SPAN style = "BACKGROUND-COLOR: #ffff99" ><%-- 通知内容将出现在这个div里 --%></ SPAN > |
16 |
< asp:ContentPlaceHolder ID = "SPNavigation" runat = "server" > |
17 |
< SharePoint:DelegateControl runat = "server" ControlId = "PublishingConsole" > |
18 |
</ SharePoint:DelegateControl > |
19 |
</ asp:ContentPlaceHolder > |
20 |
< div id = "WebPartAdderUpdatePanelContainer" > |
21 |
< asp:UpdatePanel ID = "WebPartAdderUpdatePanel" UpdateMode = "Conditional" ChildrenAsTriggers = "false” runat=" server"> |
23 |
< WebPartPages:WebPartAdder ID = "WebPartAdder" runat = "server" /> |
26 |
< asp:PostBackTrigger ControlID = "WebPartAdder" /> |
页面滚动时固定功能区
在母版页上进行以下更改,以保证页面内容滚动时不会影响功能区的使用。
- 将页面内容部分移动到下面的div内
1 |
< div id = "s4-workspace" > |
2 |
< div id = "s4-bodyContainer" > |
如果您的页面是固定宽度的,添加 s4-nosetwidth类到s4-workspace div里。
1 |
< div ID = "s4-workspace" class = "s4-nosetwidth" > |
- 将标题区域移动到如下id的div里。
1 |
< div id = "s4-titlerow" >标题区</ div > |
- 更新body标记和CSS规则,使其不滚动。 Body标记和规则将类似于下面这样:
1 |
< body scroll = "no" ...>主体内容</ body > |
将控件添加到母版页
有一组控件是SharePont功能必须的,包括:SPPageManager, ScriptManager和 ScriptLink。
将这些控件添加到您的母版页
- 打开您的母版页文件。
- 复制并粘贴以下代码,以便添加ScriptManager控件。必须放在form标记内,并且在功能区前面。
1 |
< asp:ScriptManager id = "ScriptManager" runat = "server" EnablePageMethods = "false" EnablePartialRendering = "true" EnableScriptGlobalization = "false" EnableScriptLocalization = "true" /> |
- 复制并粘贴以下代码,以便添加SPPageManager控件。 必须放在head标记内。
1 |
< SharePoint:SPPageManager runat = "server" /> |
- 复制并粘贴以下代码,以便添加ScriptLink控件。必须放在head标记内。
1 |
< SharePoint:ScriptLink defer = "true" runat = "server" /> |
- 保存您的母版页文件。
防止某些区域在模式窗口中显示
为了防止您的母版页中的某些div块或其他定义好的块显示在模式窗口(也就是那些弹出窗口,往往出现在添加文件,查看文件属性时)中,可以添加类“s4-notdlg”。
这个问题应该只发生在下列情况下:
- 网站使用了自定义的系统母版页(通常与发布页面用的母版页相同)。
- 自定义母版页中在模式窗口中应隐藏的区域对应的标记遗漏了s4-notdlg类。
比如,以下区域将出现在模式窗口中:
1 |
< div class=”cccontent”> |
添加s4-notdlg至该类将阻止这种情况的发生
1 |
< div class=”cccontent s4-notdlg”> |
添加一个Placeholder以便在母版页中使用Web部件
虽然我们无法直接在母版页中插入一个WebPart,但是可以通过在母版页中创建一个自定义的(空的)ContentPlaceholderId,由页面布局使用该Id,从而实现在指定位置插入WebPart。
在SharePoint Designer 2010中的步骤
- 在你的自定义母版页中添加一个唯一命名的内容占位符。例如:
1 |
< asp:ContentPlaceHolder id = "PlaceHolderCopyright" runat = "server" /> |
- 在页面布局中的为该占位符插入自定义内容
1 |
< asp:Content ContentPlaceholderID = "PlaceHolderCopyright" runat = "server" ></ asp:Content > |
- 使用SharePoint Designer在新建的区域中插入一个WebPart。如果希望所有继承自该页面布局的页面上都显示该WebPart,不要把WebPart放在WebPartZone里,直接放在该区域内即可。