Vorgehensweise: Hinzufügen einer Unterwebsite zur Leiste für häufig verwendete Hyperlinks oder zum Menü "Schnellstart"

Letzte Änderung: Montag, 1. November 2010

Gilt für: SharePoint Foundation 2010

Wenn Sie auf der Benutzeroberfläche von Microsoft SharePoint Foundation eine Unterwebsite erstellen, können Sie angeben, ob Links zur neuen Website im Bereich Schnellstartleiste und der Leiste für häufig verwendete Hyperlinks der übergeordneten Website angezeigt werden sollen. Sie können auch Links an beiden Stellen hinzufügen, indem Sie entsprechenden Code zur Änderung der SPWeb.Navigation.TopNavigationBar-Eigenschaft der übergeordneten Website und ihrer SPWeb.Navigation.QuickLaunch-Eigenschaft schreiben.

Im SharePoint Foundation-Objektmodell wird die Navigationsstruktur der Leiste für häufig verwendete Hyperlinks durch eine Instanz der SPNavigationNodeCollection-Klasse dargestellt. Greifen Sie zum Abrufen der Auflistung zunächst auf die SPWeb.Navigation-Eigenschaft der Website zu, die ein SPNavigation-Objekt zurückgibt, und anschließend auf die TopNavigationBar-Eigenschaft dieses Objekts zu.

VorsichtVorsicht

Wenn eine Website für die Verwendung der Leiste für häufig verwendete Hyperlinks ihrer übergeordneten Website konfiguriert ist, gibt die TopNavigationBar-Eigenschaft null zurück.

Wenn Sie über eine Auflistung von Navigationsknoten verfügen, erstellen Sie ein SPNavigationNode-Objekt zum Darstellen des neuen Links, und rufen Sie dann eine Methode der SPNavigationNodeCollection-Klasse auf, um den Knoten der Leiste für häufig verwendete Hyperlinks hinzuzufügen.

  1. Rufen Sie einen Verweis auf das SPWeb-Objekt ab, das die Unterwebsite darstellt.

    SPWeb child = site.OpenWeb("parent/child");
    
    Dim child As SPWeb = site.OpenWeb("parent/child")
    
  2. Prüfen Sie, ob die Unterwebsite tatsächlich eine Unterwebsite ist, indem Sie den Wert der IsRootWeb-Eigenschaft überprüfen. Prüfen Sie ferner, ob die übergeordnete Website keine Leiste für häufig verwendete Hyperlinks aufweist, indem Sie den Wert ihrer UseShared-Eigenschaft überprüfen.

    if (!child.IsRootWeb && !child.ParentWeb.Navigation.UseShared)
    
    If Not child.IsRootWeb AndAlso Not child.ParentWeb.Navigation.UseShared Then
    
  3. Rufen Sie das SPNavigationNodeCollection-Objekt ab, das die Leiste für häufig verwendete Hyperlinks der übergeordneten Website darstellt.

    SPNavigationNodeCollection topnav = child.ParentWeb.Navigation.TopNavigationBar;
    
    Dim topnav As SPNavigationNodeCollection = child.ParentWeb.Navigation.TopNavigationBar
    
  4. Suchen Sie einen vorhandenen Link zur Unterwebsite, indem Sie die Auflistung auf ein SPNavigationNode-Objekt mit einer Url-Eigenschaft abfragen, deren Wert dem Wert der SPWeb.ServerRelativeUrl-Eigenschaft der Unterwebsite entspricht.

    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. Falls kein Link vorhanden ist, erstellen Sie ein SPNavigationNode-Objekt zum Darstellen eines Links, und rufen Sie eine Methode der SPNavigationNodeCollection-Klasse auf, um den Link der Leiste für häufig verwendete Hyperlinks der übergeordneten Website hinzuzufügen.

    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
    

Beispiel

Das folgende Beispiel veranschaulicht das Hinzufügen eines Links zu einer Unterwebsite in der Navigationsstruktur der übergeordneten Website. Das Beispiel gehört zu einem größeren Projekt, in dem ein Feature mit dem Gültigkeitsbereich "Website" zum Hinzufügen des Links verwendet wird. Das Feature enthält einen Ereignishandler, der die SPFeatureReceiver-Klasse implementiert, und Code zum Erstellen des Links und zu dessen Hinzufügung zur übergeordneten Website in der FeatureActivated-Methode des Featureempfängers.

Wenn die Website, in der das Feature aktiviert wird, Unterwebsites hat, sucht die Methode nach einer Unterwebsite mit dem Namen "ourwiki". Wenn diese Unterwebsite vorhanden ist, ruft die Methode einen Verweis darauf ab. Wenn keine Unterwebsites vorhanden sind oder es Unterwebsites gibt, von denen jedoch keine "ourwiki" heißt, erstellt die Methode eine solche Unterwebsite.

Als Nächstes fügt die Methode den Navigationslink zur Unterwebsite hinzu. Wenn die aktuelle Website eine eigene Leiste für häufig verwendete Hyperlinks hat (d. h. nicht die Leiste der übergeordneten Website verwendet), wird der Link der Leiste für häufig verwendete Hyperlinks der aktuellen Website hinzugefügt. Andernfalls wird der Link dem Menü Schnellstart der aktuellen Website hinzugefügt.

Sowohl Schnellstart als auch die Leiste für häufig verwendete Hyperlinks werden von SPNavigationNodeCollection-Objekten dargestellt. Deshalb ist der Code an dieser Stelle unabhängig davon identisch, welche Auflistung das Ziel des Navigationslinks ist. Im Beispiel wird zunächst geprüft, ob ein Link zur Unterwebsite bereits in der Auflistung der Navigationsknoten vorhanden ist. Falls nicht, erstellt der Code einen Link und fügt ihn hinzu.

HinweisHinweis

Im Beispielcode werden mehrere Typen ohne Qualifizierung verwendet. Damit der Code ordnungsgemäß kompiliert wird, muss Ihre Featureempfängerklasse die folgenden Namespaces importieren:

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

Im SharePoint Foundation-Objektmodell wird jeder Navigationslink im Menü Schnellstart von einer Instanz der SPNavigationNode-Klasse dargestellt. Die oberste Ebene der Struktur des Menüs Schnellstart ist eine Auflistung von SPNavigationNode-Objekten, die von einer Instanz der SPNavigationNodeCollection-Klasse dargestellt werden. Die Knoten auf dieser ersten Menüebene sind die Überschriften: Liste, Bibliotheken, Websites usw. Jede Überschrift hat eine SPNavigationNode.Children-Eigenschaft, die eine Auflistung von Knoten zurückgibt, die die Links unter der Überschrift darstellen.

Zum Einfügen eines Links unter der Überschrift Websites können Sie die AddToQuickLaunch-Methode aufrufen und die Überschrift Websites angeben. Die Methode akzeptiert zwei Argumente: ein SPNavigationNode-Objekt, das den neuen Link darstellt, und einen Wert der SPQuickLaunchHeading-Aufzählung, der die Überschrift angibt, die den Link erhalten soll.

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)

Sie sollten allerdings prüfen, ob unter der Überschrift Websites nicht bereits ein Link zur Unterwebsite vorhanden ist. Eine Möglichkeit der Überprüfung wird nachfolgend erklärt.

  1. Rufen Sie einen Verweis auf das SPWeb-Objekt ab, das die Unterwebsite darstellt.

    SPWeb child = site.OpenWeb("parent/child");
    
    Dim child As SPWeb = site.OpenWeb("parent/child")
    
  2. Vergewissern Sie sich, dass die Unterwebsite auch tatsächlich eine Unterwebsite und nicht die Stammwebsite der Sammlung ist.

    if (!child.IsRootWeb)
    
    If Not child.IsRootWeb Then
    
  3. Rufen Sie das SPNavigation-Objekt der übergeordneten Website ab.

    SPNavigation nav = web.ParentWeb.Navigation;
    
    Dim nav As SPNavigation = web.ParentWeb.Navigation
    
  4. Rufen Sie die Überschrift Websites im Menü Schnellstart ab, indem Sie die GetNodeById-Methode aufrufen und das ganzzahlige Äquivalent von SPQuickLaunchHeading.Sites übergeben.

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

    Wenn das Menü Schnellstart noch nicht die Überschrift Websites enthält, gibt der Aufruf von GetNodeById den Wert null zurück.

  5. Suchen Sie nach einem vorhandenen Link zur Unterwebsite, indem Sie die untergeordneten Elemente der Überschrift Websites für ein SPNavigationNode-Objekt abrufen, das eine Url-Eigenschaft mit einem Wert hat, der dem der SPWeb.ServerRelativeUrl-Eigenschaft der Unterwebsite entspricht.

    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. Falls kein Link vorhanden ist, erstellen Sie ein SPNavigationNode-Objekt zum Darstellen eines Links, und rufen Sie die AddToQuickLaunch-Methode auf, um ihn dem Menü Schnellstart unter der Überschrift Websites der übergeordneten Website hinzuzufügen.

    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
    

Beispiel

Das folgende Beispiel ist eine Konsolenanwendung, die das Einfügen eines Links zu einer Unterwebsite im Menü Schnellstart der übergeordneten Website veranschaulicht. Sie können ähnlichen (entsprechend angepassten) Code der FeatureActivated-Methode eines Featurempfängers hinzufügen, der zum Erstellen einer Unterwebsite dient.

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

Siehe auch

Aufgaben

Gewusst wie: Anpassen der Anzeige der Schnellstartleiste

Gewusst wie: Anzeigen oder Ausblenden der Schnellstartleiste

Konzepte

Hinzufügen von Hyperlinks zur Leiste für häufig verwendete Hyperlinks

Gewusst wie: Freigeben der Leiste für häufig verwendete Hyperlinks zwischen Websites