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

上次修改时间: 2010年10月5日

适用范围: SharePoint Foundation 2010

在 Microsoft SharePoint Foundation 中,通过指定从父网站继承,可以为用户提供各网站的一致导航体验,在需要提供对等子网站之间的导航时,此继承尤为重要。在这种情况下,在网站下创建的每个子网站都共享一个顶部链接栏,并在链接之中自我表示。如果不进行导航继承,每个网站将具有自己的导航。共享导航必须通过父网站的顶部链接栏实现。

在多个网站之间共享一个顶部链接栏可以简化用户体验,因为这样可以更轻松地进行跨网站导航。尽管共享导航可简化导航过程,但不应将它代替仔细的规划。了解到共享导航控制表示的是一个"平面"网站结构,并可能导致用户将其与网站集中创建的网站的实际层次结构混淆。

使用用户界面来共享顶部链接栏

通过用户界面,可以实现网站集中的网站之间的共享导航控制。可以指定在创建每个网站时或创建每个网站后共享顶部链接栏。

在创建子网站时,向子网站添加父网站的顶部链接栏

  1. 在"创建"页上,单击"其他选项"。

  2. 在"导航继承"部分的"是否使用父网站的顶部链接栏?"之后,单击"是"。

  3. 单击"创建"。

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

  1. 导航到子网站。

  2. 单击"网站操作",然后单击"网站设置"。

  3. 在"网站设置"页上,在"外观"部分中单击"顶部链接栏"。

  4. 在"顶部链接栏"页上,单击"使用来自父级的链接",然后在打开的消息框中单击"确定"。

使用对象模型来共享顶部链接栏

网站上的导航操作由存储在 SPNavigation 对象上的设置控制,该对象由表示该网站的 SPWeb 对象的 Navigation 属性返回。

网站是否使用来自其父网站的顶部链接栏取决于 SPNavigation 对象的 UseShared 属性的设置。如果 UseShared 返回 true,则子网站从其父网站继承顶部链接栏;否则,子网站使用自己独有的顶部链接栏。

备注

网站集中的根网站无法继承顶部链接栏,因为它没有要继承的父网站。因此,当 SPWeb.IsRootWeb 返回 true 时,SPWeb.Navigation.UseShared 会返回 false。如果您尝试将根网站的 UseShared 属性设置为 true,则会引发异常。

当您通过代码创建网站时,不能在单个调用中创建网站并将父网站的顶部链接栏添加到该网站中。您必须首先创建网站,然后添加父网站的顶部链接栏。有关示例,请参阅 SPWebCollection.Add 方法。

将父网站的顶部链接栏添加到子网站中

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

    SPWeb child = site.OpenWeb("parent/child");
    
    Dim child As SPWeb = site.OpenWeb("parent/child")
    
  2. 确认 SPWeb.IsRootWeb 返回 false。

    if (!child.IsRootWeb)
    
    If Not child.IsRootWeb Then
    
  3. 获取子网站的 Navigation 属性,并且在返回的对象上,将 UseShared 属性设置为 true。

    child.Navigation.UseShared = true;
    
    child.Navigation.UseShared = True
    

示例

下面的示例是一个将父网站的顶部链接栏添加到子网站中的控制台应用程序。该应用程序还通过向子网站中添加链接来修改父网站的顶部链接栏。SPNavigation 对象的 TopNavigationBar 属性返回 SPNavigationNodeCollection 对象。向顶部链接栏中添加节点时只需创建 SPNavigationNode 对象并将它添加到表示顶部链接栏的 SPNavigationNodeCollection 中。

请注意,在添加链接之前,应用程序会首先进行检查以确保父级没有继承链接。如果父级继承了链接,则其 SPNavigationNodeCollection 为 null,因而无法添加链接。如果该集合不为 null,则应用程序会检查父级的顶部链接栏上是否已存在指向子级的链接。如果父级没有指向子级的现有链接,则会添加该链接。

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"))
            {
                using (SPWeb child = site.OpenWeb("parent/child"))
                {
                    // Verify that this is not the root of a site collection.
                    if (!child.IsRootWeb)
                    {
                        // Use links from parent on the child's top link bar.
                        child.Navigation.UseShared = true;

                        // If the parent web's top link bar is not inherited,
                        // add a link to the child on the parent's top link bar.
                        if (!child.ParentWeb.Navigation.UseShared)
                        {
                            // Get the parent's top link bar.
                            SPNavigationNodeCollection topnav = child.ParentWeb.Navigation.TopNavigationBar;

                            // Query for an existing link to the child.
                            SPNavigationNode node = topnav
                                .Cast<SPNavigationNode>()
                                .FirstOrDefault(n => n.Url.Equals(child.ServerRelativeUrl));

                            // No link, so add one.
                            if (node == null)
                            {
                                // Truncate long a title.
                                string linkTitle = child.Title;
                                if (linkTitle.Length > 15)
                                    linkTitle = linkTitle.Substring(0, 12) + "...";

                                // Create the node.
                                node = new SPNavigationNode(linkTitle, child.ServerRelativeUrl);

                                // Add it.
                                node = topnav.AddAsLast(node);
                            }
                        }
                    }
                }
            }
            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 child As SPWeb = site.OpenWeb("parent/child")

                ' Verify that this is not the root of a site collection.
                If Not child.IsRootWeb Then

                    ' Use links from parent on the child's top link bar.
                    child.Navigation.UseShared = True

                    ' If the parent web's top link bar is not inherited,
                    ' add a link to the child on the parent's top link bar.
                    If Not child.ParentWeb.Navigation.UseShared Then

                        ' Get the parent's top link bar.
                        Dim topnav As SPNavigationNodeCollection = child.ParentWeb.Navigation.TopNavigationBar

                        ' Query for an existing link to the child.
                        Dim node As SPNavigationNode = topnav.Cast(Of SPNavigationNode)().FirstOrDefault(Function(n) n.Url.Equals(child.ServerRelativeUrl))

                        ' No link, so add one.
                        If node Is Nothing Then
                            ' Truncate long a title.
                            Dim linkTitle As String = child.Title
                            If linkTitle.Length > 15 Then
                                linkTitle = linkTitle.Substring(0, 12) + "..."
                            End If

                            ' Create the node.
                            node = New SPNavigationNode(linkTitle, child.ServerRelativeUrl)

                            ' Add it.
                            node = topnav.AddAsLast(node)
                        End If

                    End If

                End If

            End Using

        End Using

        Console.Write(vbCrLf & "Press ENTER to continue....")
        Console.Read()
    End Sub

End Module

请参阅

任务

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

概念

导航控件