如何:向顶部链接栏或快速启动菜单添加子网站
上次修改时间: 2010年11月1日
适用范围: SharePoint Foundation 2010
当您通过 Microsoft SharePoint Foundation 用户界面创建子网站时,可指定"快速启动"区域和父网站的顶部链接栏中是否显示指向新网站的链接。还可通过编写操作父网站的 SPWeb.Navigation.TopNavigationBar 属性及其 SPWeb.Navigation.QuickLaunch 属性的代码在这两个位置添加链接。
在顶部链接栏中插入链接
在 SharePoint Foundation 对象模型中,顶部链接栏的导航结构由 SPNavigationNodeCollection 类的实例表示。若要获取集合,请先访问网站的 SPWeb.Navigation 属性(该属性将返回一个 SPNavigation 对象),然后再访问该对象的 TopNavigationBar 属性。
警告 |
---|
如果将网站配置为使用其父网站中的顶部链接栏,则 TopNavigationBar 属性将返回 null。 |
若您具有一组导航节点,请构造一个 SPNavigationNode 对象以表示新链接,然后调用 SPNavigationNodeCollection 类的方法以向顶部链接栏中添加节点。
向父网站的顶部链接栏上的子网站添加链接
获取对表示子网站的 SPWeb 对象的引用。
SPWeb child = site.OpenWeb("parent/child");
Dim child As SPWeb = site.OpenWeb("parent/child")
通过测试 IsRootWeb 属性的值来验证该子网站是否确实是一个子网站;另外,通过测试父网站的 UseShared 属性的值来验证该父网站是否未使用共享顶部链接栏。
if (!child.IsRootWeb && !child.ParentWeb.Navigation.UseShared)
If Not child.IsRootWeb AndAlso Not child.ParentWeb.Navigation.UseShared Then
获取表示父网站的顶部链接栏的 SPNavigationNodeCollection 对象。
SPNavigationNodeCollection topnav = child.ParentWeb.Navigation.TopNavigationBar;
Dim topnav As SPNavigationNodeCollection = child.ParentWeb.Navigation.TopNavigationBar
通过在集合中查询具有 Url 属性(其值与子网站的 SPWeb.ServerRelativeUrl 属性的值相等)的 SPNavigationNode 对象,检查指向子网站的现有链接。
SPNavigationNode node = topnav .Cast<SPNavigationNode>() .FirstOrDefault(n => n.Url.Equals(child.ServerRelativeUrl));
Dim node As SPNavigationNode = topnav.Cast(Of SPNavigationNode)().FirstOrDefault( _ Function(n) n.Url.Equals(child.ServerRelativeUrl))
如果不存在链接,请构造一个 SPNavigationNode 对象以表示链接,并从 SPNavigationNodeCollection 类调用一个方法以将其添加到父网站的顶部链接栏。
if (node == null) { node = new SPNavigationNode(child.Title, child.ServerRelativeUrl); node = topnav.AddAsLast(node); }
If node Is Nothing Then node = New SPNavigationNode(child.Title, child.ServerRelativeUrl) node = topnav.AddAsLast(node) End If
示例
下面的示例演示如何在父网站的导航结构中添加指向子网站的链接。该示例是使用一个 Web 范围的功能添加链接的大型项目的一部分。该功能包括一个实现 SPFeatureReceiver 类的事件处理程序,而用来创建链接并将链接添加到父网站的代码位于功能接收器的 FeatureActivated 方法中。
如果在其中激活功能的网站包含子网站,则该方法将查找一个名为"ourwiki"的子网站。如果此子网站存在,则该方法将获取对此网站的引用。如果不存在子网站,或存在子网站但其名称不为"ourwiki",则该方法将创建一个具有该名称的子网站。
接下来,该方法将添加指向子网站的导航链接。如果当前网站具有自己的顶部链接栏(即未使用其父级的链接栏),则会将链接添加到当前网站的顶部链接栏。否则,会将其添加到当前网站的"快速启动"菜单。
"快速启动"和顶部链接栏都由 SPNavigationNodeCollection 对象表示。因此,在这一点上,代码是相同的,不管哪个集合是导航链接的目标。该示例首先检查指向子网站的链接是否已位于导航节点集合中。如果没有,则代码将创建一个链接并添加该链接。
备注
该示例代码可以在不限定的情况下使用多个类型。为了正确编译代码,您的功能接收器类必须导入以下命名空间:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
// Get the website where the feature is activated.
SPWeb parentWeb = properties.Feature.Parent as SPWeb;
if (parentWeb == null)
return;
SPWeb childWeb = null;
string childName = "ourwiki";
// If a subsite by that name exists, open it.
string[] webs = parentWeb.Webs.Names;
if (webs != null && Array.IndexOf(webs, childName) >= 0)
{
childWeb = parentWeb.Webs[childName];
}
// Otherwise, create the subsite.
if (childWeb == null)
{
string title = "Wiki";
string desc = "A place to capture knowledge.";
uint lcid = parentWeb.Language;
string templateName = "WIKI#0";
childWeb = parentWeb.Webs.Add(childName, title, desc, lcid, templateName, false, false);
}
// Let the subsite use the parent site's top link bar.
childWeb.Navigation.UseShared = true;
// Get a collection of navigation nodes.
SPNavigationNodeCollection nodes = null;
if (parentWeb.Navigation.UseShared)
{
// Parent site does not have its own top link bar
// so use the parent's Quick Launch.
nodes = parentWeb.Navigation.QuickLaunch;
}
else
{
// Parent site has its own top link bar,
// so use it.
nodes = parentWeb.Navigation.TopNavigationBar;
}
// Check for an existing link to the subsite.
SPNavigationNode node = nodes
.Cast<SPNavigationNode>()
.FirstOrDefault(n => n.Url.Equals(childWeb.ServerRelativeUrl));
// No link, so add one.
if (node == null)
{
// Create the node.
node = new SPNavigationNode(childWeb.Title, childWeb.ServerRelativeUrl);
// Add it to the collection.
node = nodes.AddAsLast(node);
}
childWeb.Dispose();
parentWeb.Dispose();
}
Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties)
'Get the website where the feature is activated.
Dim parentWeb As SPWeb = TryCast(properties.Feature.Parent, SPWeb)
If parentWeb Is Nothing Then
Return
End If
Dim childWeb As SPWeb = Nothing
Dim childName As String = "ourwiki"
' If a subsite by that name exists, open it.
Dim webs As String() = parentWeb.Webs.Names
If webs IsNot Nothing AndAlso Array.IndexOf(webs, childName) >= 0 Then
childWeb = parentWeb.Webs(childName)
End If
' Otherwise, create the subsite.
If childWeb Is Nothing Then
Dim title As String = "Wiki"
Dim desc As String = "A place to capture knowledge."
Dim lcid As UInteger = parentWeb.Language
Dim templateName As String = "WIKI#0"
childWeb = parentWeb.Webs.Add(childName, title, desc, lcid, _
templateName, False, False)
End If
' Let the subsite use the parent site's top link bar.
childWeb.Navigation.UseShared = True
' Get a collection of navigation nodes.
Dim nodes As SPNavigationNodeCollection = Nothing
If parentWeb.Navigation.UseShared Then
' Parent site does not have its own top link bar
' so use the parent's Quick Launch.
nodes = parentWeb.Navigation.QuickLaunch
Else
' Parent site has its own top link bar,
' so use it.
nodes = parentWeb.Navigation.TopNavigationBar
End If
' Check for an existing link to the subsite.
Dim node As SPNavigationNode = nodes.Cast(Of SPNavigationNode)().FirstOrDefault( _
Function(n) n.Url.Equals(childWeb.ServerRelativeUrl))
' No link, so add one.
If node Is Nothing Then
' Create the node.
node = New SPNavigationNode(childWeb.Title, childWeb.ServerRelativeUrl)
' Add it to the collection.
node = nodes.AddAsLast(node)
End If
childWeb.Dispose()
parentWeb.Dispose()
End Sub
在"快速启动"菜单中插入链接
在 SharePoint Foundation 对象模型中,"快速启动"菜单上的每个导航链接均由 SPNavigationNode 类的一个实例表示。"快速启动"菜单结构的顶层是一个由 SPNavigationNodeCollection 类的实例表示的 SPNavigationNode 对象的集合。该菜单的第一层上的节点为标题 -"列表"、"库"、"网站"等。每个标题均有一个 SPNavigationNode.Children 属性,该属性将返回一个表示标题下链接的节点的集合。
若要在"网站"标题下插入一个链接,您可以调用 AddToQuickLaunch 方法并指定"网站"标题。此方法接受两个参数:一个表示新链接的 SPNavigationNode 对象和一个指定应接收链接的标题的 SPQuickLaunchHeading 枚举值。
SPNavigation nav = web.ParentWeb.Navigation;
SPNavigationNode node = new SPNavigationNode(web.Title, web.ServerRelativeUrl);
node = nav.AddToQuickLaunch(node, SPQuickLaunchHeading.Sites);
Dim nav As SPNavigation = web.ParentWeb.Navigation
Dim node As SPNavigationNode = New SPNavigationNode(web.Title, web.ServerRelativeUrl)
node = nav.AddToQuickLaunch(node, SPQuickLaunchHeading.Sites)
您当然希望进行检查以确保"网站"标题下没有指向子网站的链接。以下过程介绍了一种检查方法。
在父网站的"快速启动"上添加指向子网站的链接
获取对表示子网站的 SPWeb 对象的引用。
SPWeb child = site.OpenWeb("parent/child");
Dim child As SPWeb = site.OpenWeb("parent/child")
确认子网站确实是一个子网站,而不是集合的根网站。
if (!child.IsRootWeb)
If Not child.IsRootWeb Then
获取父网站的 SPNavigation 对象。
SPNavigation nav = web.ParentWeb.Navigation;
Dim nav As SPNavigation = web.ParentWeb.Navigation
通过调用 GetNodeById 方法并传递 SPQuickLaunchHeading.Sites 的整数等效项,可在"快速启动"菜单上获取"网站"标题。
SPNavigationNode sitesHeading = nav.GetNodeById((int)SPQuickLaunchHeading.Sites);
Dim sitesHeading As SPNavigationNode = nav.GetNodeById(CInt(SPQuickLaunchHeading.Sites))
备注
如果"快速启动"菜单没有"网站"标题,则调用 GetNodeById 将返回 null。
通过在"网站"标题的子级中查询 SPNavigationNode 对象(其 Url 属性的值与子网站的 SPWeb.ServerRelativeUrl 属性的值相等)来检查指向子网站的现有链接。
SPNavigationNode newNode = null; if (sitesHeading != null) { newNode = sitesHeading .Children .Cast<SPNavigationNode>() .FirstOrDefault(n => n.Url == web.ServerRelativeUrl); }
Dim newNode As SPNavigationNode = Nothing If sitesHeading IsNot Nothing Then newNode = sitesHeading.Children.Cast(Of SPNavigationNode)().FirstOrDefault( _ Function(n) n.Url = web.ServerRelativeUrl) End If
如果不存在链接,请构造一个 SPNavigationNode 对象以表示链接,并调用 AddToQuickLaunch 方法以将其添加到"网站"标题下父网站的"快速启动"菜单。
if (newNode == null) { // Create the link. newNode = new SPNavigationNode(web.Title, web.ServerRelativeUrl); // Add it to the parent site's Quick Launch. newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites); }
If newNode Is Nothing Then ' Create the link. newNode = New SPNavigationNode(web.Title, web.ServerRelativeUrl) ' Add it to the parent site's Quick Launch. newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites) End If
示例
以下示例是一个控制台应用程序,它演示在父网站的"快速启动"菜单上插入指向子网站的链接的过程。可以在创建子网站的功能接收器的 FeatureActivated 方法中添加相似代码(进行了适当修改)。
using System;
using System.Linq;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Navigation;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
using (SPSite site = new SPSite("https://localhost"))
{
// Get the subsite.
using (SPWeb web = site.OpenWeb("parent/child"))
{
if (!web.IsRootWeb)
{
// Get the parent site's navigator.
SPNavigation nav = web.ParentWeb.Navigation;
// Get the Sites heading.
SPNavigationNode sitesHeading = nav.GetNodeById((int)SPQuickLaunchHeading.Sites);
// Check if a link to the child already exists.
SPNavigationNode newNode = null;
if (sitesHeading != null)
{
newNode = sitesHeading
.Children
.Cast<SPNavigationNode>()
.FirstOrDefault(n => n.Url == web.ServerRelativeUrl);
}
// No link, so create one.
if (newNode == null)
{
// Create the link.
newNode = new SPNavigationNode(web.Title, web.ServerRelativeUrl);
// Add it to the parent site's Quick Launch.
newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites);
}
Console.WriteLine("A link to {0} is on the Quick Launch for {1}", newNode.Title, nav.Web.Title);
}
}
}
Console.Write("\nPress ENTER to continue....");
Console.ReadLine();
}
}
}
Imports System
Imports Microsoft.SharePoint
Imports Microsoft.SharePoint.Navigation
Module ConsoleApp
Sub Main()
Using site As New SPSite("https://localhost")
Using web As SPWeb = site.OpenWeb("parent/child")
If Not web.IsRootWeb Then
' Get the parent site's navigator.
Dim nav As SPNavigation = web.ParentWeb.Navigation
' Get the Sites heading.
Dim sitesHeading As SPNavigationNode = nav.GetNodeById(CInt(SPQuickLaunchHeading.Sites))
' Check if a link to the child already exists.
Dim newNode As SPNavigationNode = Nothing
If sitesHeading IsNot Nothing Then
newNode = sitesHeading.Children.Cast(Of SPNavigationNode)().FirstOrDefault( _
Function(n) n.Url = web.ServerRelativeUrl)
End If
' No link, so create one.
If newNode Is Nothing Then
' Create the link.
newNode = New SPNavigationNode(web.Title, web.ServerRelativeUrl)
' Add it to the parent site's Quick Launch.
newNode = nav.AddToQuickLaunch(newNode, SPQuickLaunchHeading.Sites)
End If
Console.WriteLine("A link to {0} is on the Quick Launch for {1}", newNode.Title, nav.Web.Title)
End If
End Using
End Using
Console.Write(vbCrLf & "Press ENTER to continue....")
Console.Read()
End Sub
End Module