以编程方式自定义 SharePoint 2010 网站导航
[http://msdn.microsoft.com/zh-cn/library/hh537941.aspx]
SharePoint 中的导航概述
用户请求的最常用自定义项之一是更改其 SharePoint 2010 网站的导航结构的能力。虽然在出现新列表、库和子网站后会自动更新 SharePoint 网站的导航元素,但用户经常希望更改或移除链接。在基于 SharePoint 的 Intranet 或 Extranet 网站中,用户添加指向通常深嵌在网站中的内部和外部资源的链接。例如,以特定部门或角色为中心的网站通常链接到多个广泛分布的资源。
用户主要通过位于网页顶部的顶部链接栏和位于网页左侧的快速启动栏导航 SharePoint 网站,如图 1 所示。
图 1. 顶部链接栏和快速启动栏
网站标题下的选项卡集合是顶部链接栏。网页左侧的多级链接列表是快速启动栏。本节解释如何配置导航控件显示的链接,以及如何添加指向外部资源的链接。
在 SharePoint Foundation 2010 中使用与在 SharePoint Server 2010 中所用的不同的网页编辑导航。表 1 列出了要编辑的网页以及哪个版本的 SharePoint 2010 使用它们。
表 1. 按版本编辑导航
导航控件 |
SharePoint Foundation 2010 |
SharePoint Server 2010 |
快速启动栏 |
“快速启动”页 |
“导航设置”页 |
顶部链接栏 |
“顶部链接栏”页 |
“导航设置”页 |
在 SharePoint Foundation 2010 中编辑导航
可以在 SharePoint Foundation 2010 中使用“网站设置”页访问多个其他网页,您可以在其中编辑网站上的导航。若要打开“网站设置”页,请单击“网站操作”,然后单击“网站设置”。
第一页是“快速启动”页。单击“网站设置”页的“外观”部分的“快速启动”链接可访问“快速启动”页。标题和链接按照其在快速启动栏上的显示列出。您可以通过单击要编辑的项左侧的编辑图标来编辑标题或链接。单击“新建标题”链接可在顶级添加新标题。单击“新建导航链接”可在其中一个标题下添加新链接。单击“更改顺序”可重新排序标题和链接。
图 2. 快速启动
下一页是“顶部链接栏”页,其中列出了网站的顶部链接栏中的选项卡。若要访问此页,请单击“网站设置”页的“外观”部分的“顶部链接栏”。可以通过单击选项卡左侧的编辑图标来编辑选项卡。可以通过单击“新建导航”[###New Navigation]来创建新选项卡。还可以通过单击“更改顺序”来重新排序选项卡。
注释: |
---|
“快速启动”和“顶部链接栏”页的链接只显示在 SharePoint Foundation 2010 中。SharePoint Server 2010 使用“导航设置”页,将在下一节中介绍该页。 |
图 3. 顶部链接栏
在 SharePoint Server 2010 中编辑导航
在 SharePoint Server 2010 中,“导航设置”页将“快速启动”和“顶部链接栏”页的功能组合到一个网页中。若要访问“导航设置”页,请单击“网站设置”页的“外观”部分下的“导航”。使用“全局导航”部分配置顶部链接栏如何自动更新。单选按钮使您能够配置网站是从其父网站继承顶部链接栏还是使用自己的顶部链接栏。如果您希望 SharePoint Server 2010 自动显示网站中创建的新子网站和网页,请选中相应的复选框。
图 4. 导航设置
“当前导航”部分适用于快速启动栏。“排序”部分使您能够配置顶部链接栏和快速启动栏中的项是否自动排序。“导航编辑”[###Navigation Editing]和“排序”部分使您能够将链接添加到顶部链接栏(全局导航)和快速启动栏(当前导航)中。如果单击“排序”部分的“手动排序”,则可以使用树和它之上的按钮上下移动标题和链接来确定它们的位置。其他按钮使您能够编辑、删除和添加新标题和链接。使用“显示和隐藏功能区”可显示或隐藏用于显示和隐藏功能区的控件。如果使用的是 SharePoint Foundation 2010,“导航设置”页不可用。不过,可以生成类似功能,如下几节中所述。
显示导航层次结构
若要将标题和链接添加到网站的导航中,请使用要自定义的网站的 SPWeb 对象的 Navigation 属性。Navigation 属性返回表示网站中的顶部链接栏和快速启动栏的 SPNavigation 对象。SPNavigation 类包括 TopNavigation 属性和 QuickLaunch 属性,您使用它们来访问、修改和移除顶部链接栏或快速启动栏中的项。
using Microsoft.SharePoint; using Microsoft.SharePoint.Navigation; SPWeb site = SPContext.Current.Web; SPNavigationNodeCollection topLinkBar = site.Navigation.TopNavigationBar; SPNavigationNodeCollection topLinkBar = site.Navigation.QuickLaunch;
在前面的代码示例中,SPContext 类的 Current 属性用于获取表示当前网站的 SPWeb 类的实例。接下来,SPWeb 类的 Navigation 属性用于获取包含顶部链接栏和快速启动栏链接的SPNavigationNodeCollection 对象,其中,每个链接由 SPNavigationNode 对象表示。每个 SPNavigationNode 对象具有 Children 属性,其中包含零个或多个构成层次结构的SPNavigationNode 对象。通过 ASP.Net TreeView 控件显示层次结构,如图 5 所示。您可以仅将 TreeView 控件添加到网站页面或应用程序页面中,但无法使用 Visual Studio 中的可视设计器,因为这些页面引用网站的母版页。
图 5. TreeView 控件中显示的顶部链接栏和快速启动栏
下面的代码用于填充图 5 中的 TreeView 控件。
topNavTreeView.Nodes.Add(new TreeNode("Top Link Bar Links")); quickLaunchTreeView.Nodes.Add(new TreeNode("Quick Launch Links")); RecurseNodes(site.Navigation.TopNavigationBar, topNavTreeView.Nodes[0].ChildNodes); RecurseNodes(site.Navigation.QuickLaunch, quickLaunchTreeView.Nodes[0].ChildNodes); topNavTreeView.ExpandAll(); quickLaunchTreeView.ExpandAll();
两个 TreeView 控件最初填充了根节点,它是顶部链接栏和快速启动栏中的节点的父级。接下来,当前网站的 SPWeb 对象获取对表示顶部链接栏和快速启动栏的SPNavigationNodeCollection 对象的引用。将 SPNavigationNodeCollection 对象以及相关的 TreeView 控件的根节点的 ChildNodes 属性传递给 RecurseNodes 函数以填充 TreeView 控件。RecurseNodes 函数在跟随顶部链接栏和快速启动栏的层次结构时填充 TreeView 控件。
private void RecurseNodes(SPNavigationNodeCollection nodes, TreeNodeCollection treeNodes) { foreach (SPNavigationNode node in nodes) { TreeNode treeNode = new TreeNode(); treeNode.Text = node.Title; treeNode.ToolTip = node.Url; treeNode.ShowCheckBox = true; treeNode.Checked = node.IsExternal; treeNode.Value = node.Id.ToString(); treeNodes.Add(treeNode); RecurseNodes(node.Children, treeNode.ChildNodes); } }
在 RecurseNodes 函数中,为顶部链接栏和快速启动栏中的每个节点创建一个新 TreeNode 对象并将其添加到 TreeView 控件中相应父级。使用 SPNavigationNode 类的各种属性来配置TreeNode 对象,如表 2 中所述。最后,RecurseNodes 函数再次调用自身来填充当前节点的任何后代。
表 2. SPNavigationNode 属性
属性名称 |
说明 |
Id |
SPNavigationNode 对象的唯一标识符。 |
Title |
生成链接的显示文本。 |
Url |
生成链接的 URL。 |
IsExternal |
指示 Url 的值是否指向 SharePoint 以外的资源。 |
注释: |
---|
在顶部链接栏和快速启动栏中,仅使用层次结构的前两个层次。在顶部链接栏中,第一个层次显示为选项卡。第二个层次显示在选项卡下的下拉菜单中(如果选项卡具有子级)。在快速启动栏中,第一个层次显示为标题,第二个层次显示在相应的第一个层次链接下。 |
将链接添加到网站的导航中
使用下面的代码将链接添加到顶部链接栏或快速启动栏中。
using Microsoft.SharePoint; using Microsoft.SharePoint.Navigation; SPWeb site = SPContext.Current.Web; SPNavigationNode node = new SPNavigationNode( topNavTitleTextBox.Text, topNavUrlTextBox.Text, topNavIsExternalCheckBox.Checked); if (topNavTreeView.SelectedNode == topNavTreeView.Nodes[0]) { site.Navigation.TopNavigationBar.AddAsLast(node); } else { int parentId = int.Parse(topNavTreeView.SelectedNode.Value); site.Navigation.GetNodeById(parentId).Children.AddAsLast(node); } if (topNavOpenInNewWindowCheckBox.Checked) { node.Properties["Target"] = "_blank"; node.Update(); }
在前面的代码示例中,将链接的显示文本、URL 以及链接是指向 SharePoint 内部还是外部的资源传递给 SPNavigationNode 类的构造函数。
注释: |
---|
如果您将 False 传递给 SPNavigationNode 构造函数的 isExternal 参数,而 URL 不指向 SharePoint 内部的资源,则 SharePoint 会引发异常。 |
如果您希望将链接添加为第一个层次的节点以便它显示为选项卡,请调用 site.Navigation.TopNavigationBar.AddAsLast 方法,并传入新的 SPNavigationNode 对象。否则,使用SPNavigation 类的 GetNodeById 方法来获取对顶部链接栏中的父节点的引用并改用其 Children 属性。在这种情况下,链接显示在父选项卡下的下拉菜单中。
此时,SPNavigationNode 对象添加到了顶部链接栏中并在网页重新加载时显示。不过,如果您希望链接在新窗口中打开,则必须使用 SPNavigationNode 类的 Properties 属性 (Property) 来存储链接的 Target 属性 (Attribute) 值。如果您希望在单击链接时链接打开新的浏览器窗口,请使用 _blank
。最后,调用 SPNavigationNode 的 Update 方法来保存更改。
注释: |
---|
前面的代码示例适用于顶部链接栏。在替换了相应的匹配控件后,对快速启动栏使用相同的代码。 |
从网站的导航中删除链接
使用下面的代码从顶部链接栏或快速启动栏中删除链接。
using Microsoft.SharePoint; using Microsoft.SharePoint.Navigation; SPWeb site = SPContext.Current.Web; int id = int.Parse(topNavTreeView.SelectedNode.Value); SPNavigationNode node = site.Navigation.GetNodeById(id); node.Delete();
在前面的代码示例中,使用 SPNavigation 类的 GetNodeById 方法来获取对链接的 SPNavigationNode 的引用。因为第一个代码示例将 SPNavigationNode 对象的 Id 属性分配给了 TreeNode对象的 Value 属性,所以在选择了 TreeView 控件中的节点后,可以确定 SPNavigationNode 对象的 Id 值。在获取对 SPNavigationNode 对象的引用后,调用其 Delete 方法会从网站的导航中移除它,而不管以前是将它添加到了顶部链接栏中还是快速启动栏中。
警告: |
---|
在删除 SPNavigationNode 对象时,还会删除其子级。 |
结论
编辑 SharePoint Foundation 2010 网站的导航和编辑 SharePoint Server 2010 网站的导航之间存在许多差异。“快速启动栏”和“顶部链接栏”页提供了网站导航的基本编辑;“导航设置”页将这二者组合到了一个网页中。利用“导航设置”页,还可以更好地控制链接何时自动添加到网站的导航中。使用本文中的代码,您可以在 SharePoint Foundation 2010 中提供类似于 SharePoint Server 2010 中的编辑体验,或者通过在网站的导航中自动创建指向业务线系统的链接来集成这些系统。
若要下载本文附带的代码,请参阅以编程方式自定义网站导航(该链接可能指向英文页面)。