Поделиться через


Практическое руководство. Добавление ссылки на дочерний сайт на верхнюю панель ссылок или в меню быстрого запуска

Дата последнего изменения: 1 ноября 2010 г.

Применимо к: 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. Проверьте существование ссылки на дочерний сайт, запросив коллекцию для объекта SPNavigationNode, имеющего свойство Url, значение которого равно свойству SPWeb.ServerRelativeUrl дочернего сайта.

    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
    

Пример

В следующем примере показано добавление ссылки на дочерний сайт в структуру навигации родительского сайта. Пример является частью проекта, который использует для добавления ссылки компонент уровня веб-сайта. Компонент содержит обработчик событий, который реализует класс 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. Верхний уровень структуры меню Quick Launch — это коллекция объектов SPNavigationNode, представленных экземпляром класса SPNavigationNodeCollection. Узлы на первом уровне меню — это заголовки: Список, Библиотеки, Сайты и т. д. Каждый заголовок имеет свойство 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

См. также

Задачи

Настройка отображение меню быстрого запуска

Практическое руководство. Отображение и скрытие меню быстрого запуска

Концепции

Добавление ссылок на верхнюю панель ссылок

Совместное использование верхней панели ссылок разными сайтами