サイト間でトップ リンク バーを共有する
最終更新日: 2010年10月5日
適用対象: SharePoint Foundation 2010
Microsoft SharePoint Foundation では、親サイトからの継承を指定することによって、複数のサイトにわたって一貫性のあるナビゲーション操作を提供できます。ピア サブサイト間でのナビゲーションを提供する必要がある場合は特に、一貫性が重要です。その場合、サイトの下に作成された各サブサイトがトップ リンク バーを共有します。また、各サブサイトがリンクに表示されます。ナビゲーション継承がなければ、ナビゲーションはサイトごとに独自のものになります。共有ナビゲーションは親サイトのトップ リンク バーをとおして実装する必要があります。
複数サイト間でトップ リンク バーを共有すると、サイト間ナビゲーションが簡単になるため、ユーザーの操作が簡略化されます。共有ナビゲーションによってナビゲーションが簡略化されますが、慎重な計画が不要になるわけではありません。共有ナビゲーション制御は "フラットな" サイト構造を表すものであり、サイト コレクション内に作成されたサイトの実際の階層に関してユーザーが混乱する可能性があります。
ユーザー インターフェイスを使用してトップ リンク バーを共有する
ユーザー インターフェイスをとおしてサイト コレクション内のサイト間に共有ナビゲーション制御を実装できます。トップ リンク バーの共有は、各サイトの作成時または各サイトの作成後に指定できます。
サブサイト作成時に親サイトのトップ リンク バーをサブサイトに追加するには
[作成] ページで、[その他のオプション] をクリックします。
[ナビゲーションの継承] セクションで、[親サイトのトップ リンク バーをこのサイトでも使用する] に対して [はい] をクリックします。
[作成] をクリックします。
親サイトのトップ リンク バーを既存のサブサイトに追加するには
サブサイトに移動します。
[サイトの操作]、[サイトの設定] の順にクリックします。
[サイトの設定] ページの [外観] セクションで、[トップ リンク バー] をクリックします。
[トップ リンク バー] ページで [親のリンクの使用] をクリックし、次に、表示されたメッセージ ボックスで [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 メソッドを参照してください。
親サイトのトップ リンク バーをサブサイトに追加するには
サブサイトを表す SPWeb オブジェクトへの参照を取得します。
SPWeb child = site.OpenWeb("parent/child");
Dim child As SPWeb = site.OpenWeb("parent/child")
SPWeb.IsRootWeb が false を返すことを確認します。
if (!child.IsRootWeb)
If Not child.IsRootWeb Then
サブサイトの 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