サイト間でトップ リンク バーを共有する

最終更新日: 2010年10月5日

適用対象: SharePoint Foundation 2010

Microsoft SharePoint Foundation では、親サイトからの継承を指定することによって、複数のサイトにわたって一貫性のあるナビゲーション操作を提供できます。ピア サブサイト間でのナビゲーションを提供する必要がある場合は特に、一貫性が重要です。その場合、サイトの下に作成された各サブサイトがトップ リンク バーを共有します。また、各サブサイトがリンクに表示されます。ナビゲーション継承がなければ、ナビゲーションはサイトごとに独自のものになります。共有ナビゲーションは親サイトのトップ リンク バーをとおして実装する必要があります。

複数サイト間でトップ リンク バーを共有すると、サイト間ナビゲーションが簡単になるため、ユーザーの操作が簡略化されます。共有ナビゲーションによってナビゲーションが簡略化されますが、慎重な計画が不要になるわけではありません。共有ナビゲーション制御は "フラットな" サイト構造を表すものであり、サイト コレクション内に作成されたサイトの実際の階層に関してユーザーが混乱する可能性があります。

ユーザー インターフェイスを使用してトップ リンク バーを共有する

ユーザー インターフェイスをとおしてサイト コレクション内のサイト間に共有ナビゲーション制御を実装できます。トップ リンク バーの共有は、各サイトの作成時または各サイトの作成後に指定できます。

サブサイト作成時に親サイトのトップ リンク バーをサブサイトに追加するには

  1. [作成] ページで、[その他のオプション] をクリックします。

  2. [ナビゲーションの継承] セクションで、[親サイトのトップ リンク バーをこのサイトでも使用する] に対して [はい] をクリックします。

  3. [作成] をクリックします。

親サイトのトップ リンク バーを既存のサブサイトに追加するには

  1. サブサイトに移動します。

  2. [サイトの操作]、[サイトの設定] の順にクリックします。

  3. [サイトの設定] ページの [外観] セクションで、[トップ リンク バー] をクリックします。

  4. [トップ リンク バー] ページで [親のリンクの使用] をクリックし、次に、表示されたメッセージ ボックスで [OK] をクリックします。

オブジェクト モデルを使用してトップ リンク バーを共有する

Web サイトでのナビゲーション操作は、そのサイトを表す SPWeb オブジェクトの Navigation プロパティによって返される SPNavigation オブジェクトに保存されている設定によって制御されます。

Web サイトがその親サイトのトップ リンク バーを使用するかどうかは、SPNavigation オブジェクトの UseShared プロパティによって異なります。UseShared が true を返す場合、サブサイトは親サイトからトップ リンク バーを継承します。それ以外の場合は、サブサイト固有の独自のトップ リンク バーを使用します。

注意

サイト コレクションのルート Web サイトは親 Web サイトがないのでトップ リンク バーを継承できません。このため、SPWeb.IsRootWeb が true を返すと、SPWeb.Navigation.UseShared は必ず false を返します。ルート Web サイトの UseShared プロパティを true に設定しようとすると、例外がスローされます。

Web サイトをコードで作成する場合、1 回の呼び出しでサイトを作成し、そのサイトに親サイトのトップ リンク バーを追加することはできません。まず、Web サイトを作成してから、親サイトのトップ リンク バーを追加する必要があります。例については、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
    

次の例は、親 Web サイトのトップ リンク バーをサブサイトに追加するコンソール アプリケーションです。アプリケーションではリンクがサブサイトに追加され、親 Web サイトのトップ リンク バーも変更されています。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

関連項目

タスク

[方法] サイド リンク バーの表示をカスタマイズする

概念

ナビゲーション コントロール