如何:向顶部链接栏或快速启动菜单添加子网站

上次修改时间: 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 类的方法以向顶部链接栏中添加节点。

向父网站的顶部链接栏上的子网站添加链接

  1. 获取对表示子网站的 SPWeb 对象的引用。

    SPWeb child = site.OpenWeb("parent/child");
    
    Dim child As SPWeb = site.OpenWeb("parent/child")
    
  2. 通过测试 IsRootWeb 属性的值来验证该子网站是否确实是一个子网站;另外,通过测试父网站的 UseShared 属性的值来验证该父网站是否未使用共享顶部链接栏。

    if (!child.IsRootWeb && !child.ParentWeb.Navigation.UseShared)
    
    If Not child.IsRootWeb AndAlso Not child.ParentWeb.Navigation.UseShared Then
    
  3. 获取表示父网站的顶部链接栏的 SPNavigationNodeCollection 对象。

    SPNavigationNodeCollection topnav = child.ParentWeb.Navigation.TopNavigationBar;
    
    Dim topnav As SPNavigationNodeCollection = child.ParentWeb.Navigation.TopNavigationBar
    
  4. 通过在集合中查询具有 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))
    
  5. 如果不存在链接,请构造一个 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)

您当然希望进行检查以确保"网站"标题下没有指向子网站的链接。以下过程介绍了一种检查方法。

在父网站的"快速启动"上添加指向子网站的链接

  1. 获取对表示子网站的 SPWeb 对象的引用。

    SPWeb child = site.OpenWeb("parent/child");
    
    Dim child As SPWeb = site.OpenWeb("parent/child")
    
  2. 确认子网站确实是一个子网站,而不是集合的根网站。

    if (!child.IsRootWeb)
    
    If Not child.IsRootWeb Then
    
  3. 获取父网站的 SPNavigation 对象。

    SPNavigation nav = web.ParentWeb.Navigation;
    
    Dim nav As SPNavigation = web.ParentWeb.Navigation
    
  4. 通过调用 GetNodeById 方法并传递 SPQuickLaunchHeading.Sites 的整数等效项,可在"快速启动"菜单上获取"网站"标题。

    SPNavigationNode sitesHeading = nav.GetNodeById((int)SPQuickLaunchHeading.Sites);
    
    Dim sitesHeading As SPNavigationNode = nav.GetNodeById(CInt(SPQuickLaunchHeading.Sites))
    

    备注

    如果"快速启动"菜单没有"网站"标题,则调用 GetNodeById 将返回 null。

  5. 通过在"网站"标题的子级中查询 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
    
  6. 如果不存在链接,请构造一个 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

请参阅

任务

如何:自定义快速启动显示

如何:显示或隐藏快速启动

概念

向顶部链接栏中添加链接

如何:共享网站之间的顶部链接栏