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


Добавление ссылок в меню быстрого запуска

Дата последнего изменения: 9 марта 2015 г.

Применимо к: SharePoint Foundation 2010

В этой статье
Навигация по структуре меню
Добавление элемента во встроенный заголовок
Указание позиции в меню
Добавление настраиваемого заголовка

На веб-сайте Microsoft SharePoint Foundation панель быстрого запуска представляет собой статическое меню в левой части большинства страниц контента. Объектная модель SharePoint Foundation представляет меню быстрого запуска в виде иерархии объектов SPNavigationNode; каждый из объектов при этом представляет собой гиперссылку в меню.

Процесс добавления новой ссылки в этом контексте состоит из создания объекта, который будет представлять собой ссылку, и его добавления в правильное место иерархии.

Навигация по структуре меню

На верхнем уровне меню быстрого запуска расположены заголовки. Чтобы получить коллекцию заголовков, нужно сначала получить объект, возвращаемый свойством Navigation веб-сайта, а затем — свойство QuickLaunch полученного объекта. Свойство QuickLaunch возвращает объект SPNavigationNodeCollection, содержащий набор объектов SPNavigationNode, представляющих собой заголовки.

SPNavigationNodeCollection ql = web.Navigation.QuickLaunch;
Dim ql As SPNavigationNodeCollection = web.Navigation.QuickLaunch

Опустимся на уровень ниже: здесь расположены дочерние элементы заголовков. Каждый объект SPNavigationNode, представляющий собой заголовок, имеет свойство Children, в котором может содержаться коллекция узлов, представляющих собой дочерние элементы заголовка. Если дочерних элементов у заголовка нет, свойство Children узла заголовка возвращает пустую коллекцию.

foreach (SPNavigationNode heading in web.Navigation.QuickLaunch)
{
    foreach (SPNavigationNode item in heading.Children)
    {

        // Do something.
    }
}
For Each heading As SPNavigationNode In web.Navigation.QuickLaunch
    For Each item As SPNavigationNode In heading.Children

        ' Do something.
    Next
Next

Заголовок и каждый из его дочерних элементов являются объектами SPNavigationNode, представляющими собой гиперссылки. Отображаемый текст каждой из ссылок заключен в свойство Title объекта, а URL-адрес — в свойство Url. Значения этих свойств не зависят от назначения, на которое указывает ссылка. Если ссылка указывает на веб-сайт, и название сайта или URL-адрес меняются, в узле навигации никаких изменений автоматически не происходит.

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

Добавление элемента во встроенный заголовок

Чтобы добавить ссылку в один из стандартных заголовков быстрого запуска (например, Списки или Библиотеки), вызовите метод AddToQuickLaunch. Этот метод принимает 2 аргумента: объект SPNavigationNode, представляющий собой новую ссылку, и значение перечисления SPQuickLaunchHeading, указывающее заголовок, который должен получить ссылку.

Метод AddToQuickLaunch принадлежит к классу SPNavigation, экземпляр которого возвращается свойством Navigation класса SPWeb.

Добавление элемента во встроенный заголовок

  1. (Необязательный шаг). Проверьте, нет ли других ссылок, указывающих на это же назначение, вызвав метод GetNodeByUrl объекта, возвращенного свойством Navigation веб-сайта.

    Если в структуре навигации сайта нет ссылок, указывающий на этот же URL-адрес, метод GetNodeByUrl вернет значение null.

  2. Создайте узел, который будет представлять собой ссылку, вызвав один из конструкторов класса SPNavigationNode.

    В этом классе присутствуют 2 конструктора:

    • Первый принимает 2 аргумента: строку с отображаемым текстом ссылки и строку с URL-адресом, в который ссылка должна разрешаться. Этот конструктор следует использовать только для внутренних ссылок (на контент в том же семействе веб-сайтов). Задаваться же URL-адрес должен относительно сервера.

    • Второй конструктор принимает 3 аргумента. Первые 2 полностью соответствуют аргументам первого конструктора. Третий же представляет собой значение типа boolean, указывающее тип ссылки (внешняя или внутренняя). Для ссылок на внешние веб-сайты следует передавать значение true (и абсолютный URL-адрес во втором аргументе). Если же ссылка внутренняя — передается значение false и URL-адрес, указанный относительно сервера.

    ПримечаниеПримечание

    До добавления в коллекцию объект SPNavigationNode инициализирован не полностью. Если объект еще не является членом коллекции, свойства, доступные только для чтения (Id, ParentId и другие), будут возвращать значение null.

  3. Вызовите метод AddToQuickLaunch, передав новый узел в первом аргументе, а значение перечисления SPQuickLaunchHeading — во втором.

    Метод AddToQuickLaunch возвращает инициализированный экземпляр класса SPNavigationNode. Этот объект можно использовать для получения других свойств узла и их задания. После изменения свойств объекта должен быть вызван метод Update.

ПримечаниеПримечание

Самый быстрый способ добавить существующий список или библиотеку документов в меню быстрого запуска — получить объект SPList, представляющий собой список или библиотеку и присвоить свойству OnQuickLaunch значение true. Элемент списка или библиотеки будет автоматически добавлен под соответствующий заголовок. Дополнительные сведения о заголовках быстрого запуска см. в описании перечисления SPQuickLaunchHeading. Если заголовок еще не отображается в меню быстрого запуска, он будет добавлен.

Пример

Консольное приложение, представленное ниже, добавляет элемент в заголовок Списки меню быстрого запуска.

using System;
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 web = site.OpenWeb())
                {
                    // Get the Links list or create it if it does not exist.
                    SPList list = web.Lists.TryGetList("Links");

                    if (list == null || list.BaseTemplate != SPListTemplateType.Links)
                    {
                        // Create the list.
                        Guid listId = web.Lists.Add("Links", "Interesting hyperlinks", SPListTemplateType.Links);
                        list = web.Lists.GetList(listId, false);
                    }

                    // Check for an existing link to the list.
                    SPNavigationNode listNode = web.Navigation.GetNodeByUrl(list.DefaultViewUrl);
 
                    // No link, so create one.
                    if (listNode == null)
                    {
                        // Create the node.
                        listNode = new SPNavigationNode(list.Title, list.DefaultViewUrl);

                        // Add it to Quick Launch.
                        listNode = web.Navigation.AddToQuickLaunch(listNode, SPQuickLaunchHeading.Lists);
                    }
                }
            }
            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()

                ' Get the Links list or create it if it does not exist.
                Dim list As SPList = web.Lists.TryGetList("Links")

                If list Is Nothing OrElse list.BaseTemplate <> SPListTemplateType.Links Then

                    ' Create the list.
                    Dim listId As Guid = web.Lists.Add("Links", "Interesting hyperlinks", SPListTemplateType.Links)
                    list = web.Lists.GetList(listId, False)
                End If

                ' Check for an existing link to the list.
                Dim listNode As SPNavigationNode = web.Navigation.GetNodeByUrl(list.DefaultViewUrl)

                ' No link, so create one.
                If listNode Is Nothing Then

                    ' Create the node.
                    listNode = New SPNavigationNode(list.Title, list.DefaultViewUrl)

                    ' Add it to Quick Launch.
                    listNode = web.Navigation.AddToQuickLaunch(listNode, SPQuickLaunchHeading.Lists)
                End If

            End Using

        End Using

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

End Module

Указание позиции в меню

Метод AddToQuickLaunch, описанный в предыдущем подразделе, добавляет новую ссылку в качестве последнего элемента в указанный заголовок меню быстрого запуска. Чтобы более точно задать позицию элемента, воспользуйтесь одним из методов класса SPNavigationNodeCollection. В следующей таблице приведено краткое описание для каждого из них.

Метод

Описание

Add

Добавляет новый узел после указанного в коллекции.

AddAsFirst

Добавляет новый узел в начало коллекции.

AddAsLast

Добавляет новый узел в конец коллекции.

В следующей процедуре описано использование метода Add для вставки ссылки сразу после указанного элемента в меню быстрого запуска.

Вставка ссылки после существующего элемента в меню

  1. Получите узел заголовка, в который планируется поместить ссылку, вызвав метод GetNodeById класса SPNavigation.

    // Get the Libraries heading.
    SPNavigationNode heading = web.Navigation.GetNodeById((int)SPQuickLaunchHeading.Documents);
    
    ' Get the Libraries heading.
    Dim heading As SPNavigationNode = web.Navigation.GetNodeById(CInt(SPQuickLaunchHeading.Documents))
    
  2. Получите узел элемента, после которого будет вставлена ссылка, опросив коллекцию, возвращенную свойством Children узла заголовка.

    // If a node for Shared Documents exists, the new node will go after it.
    SPList sharedDocs = web.Lists.TryGetList("Shared Documents");
    SPNavigationNode sharedDocsNode = null;
    if (sharedDocs != null)
        sharedDocsNode = librariesHeading
            .Children
            .Cast<SPNavigationNode>()
            .FirstOrDefault(n => n.Url == sharedDocs.DefaultViewUrl);
    
    ' If a node for Shared Documents exists, the new node will go after it.
    Dim sharedDocs As SPList = web.Lists.TryGetList("Shared Documents")
    Dim sharedDocsNode As SPNavigationNode = Nothing
    If sharedDocs IsNot Nothing Then
        sharedDocsNode = librariesHeading.Children.Cast(Of SPNavigationNode)().FirstOrDefault( _
            Function(n) n.Url = sharedDocs.DefaultViewUrl)
    End If
    
  3. Создайте объект SPNavigationNode, который будет представлять собой новую ссылку.

    SPNavigationNode newNode = new SPNavigationNode(list.Title, list.DefaultViewUrl);
    
    Dim newNode As SPNavigationNode = New SPNavigationNode(list.Title, list.DefaultViewUrl)
    
  4. Добавьте ссылку, вызвав метод Add и передав новый узел в первом аргументе, а узел, после которого его следует разместить, — во втором.

    newNode = heading.Children.Add(newNode, sharedDocsNode);
    
    newNode = heading.Children.Add(newNode, sharedDocsNode)
    
ПримечаниеПримечание

До добавления в коллекцию объект SPNavigationNode инициализирован не полностью. Если объект еще не является членом коллекции, свойства, доступные только для чтения (Id, ParentId и другие), будут возвращать значение null.

Пример

В приведенном ниже примере продемонстрировано добавление ссылки в определенную позицию меню быстрого запуска. Пример является частью более крупного проекта, в рамках которого компонент уровня веб-сайта используется для создания библиотеки документов для заметок о собраниях (Meeting Notes). В компонент входит обработчик событий, реализующий класс SPFeatureReceiver. В методе FeatureActivated приемника компонентов присутствует код, отвечающий за создание библиотеки Meeting Notes и добавление ссылки на нее под заголовок Библиотеки. Если в меню уже есть ссылка на библиотеку общих документов (Shared Documents), новая ссылка вставляется сразу после нее. Если же ссылки на эту библиотеку нет, ссылка на Meeting Notes добавляется как первый элемент под заголовком Библиотеки.

ПримечаниеПримечание

В коде примера используется несколько неквалифицированных типов. Чтобы обеспечить правильную компиляцию кода, класс приемника компонентов должен импортировать следующие пространства имен:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    // Get the website where the feature is activated.
    SPWeb web = properties.Feature.Parent as SPWeb;
    if (web == null)
        return;

    // Get the Meeting Notes document library.
    SPList meetingNotes = web.Lists.TryGetList("Meeting Notes");
    if (meetingNotes == null)
    {
        // Create the library if it does not exist.
        Guid listId = web.Lists.Add("Meeting Notes", "An archive for meeting notes.", SPListTemplateType.DocumentLibrary);
        meetingNotes = web.Lists.GetList(listId, false);
    }

    // Check for an existing Quick Launch node for Meeting Notes.
    SPNavigationNode meetingNotesNode = web.Navigation.GetNodeByUrl(meetingNotes.DefaultViewUrl);

    // If a Meeting Notes node exists on Quick Launch, nothing more to do.
    if (meetingNotesNode != null)
        return;

    // Still here, so create a node for Meeting Notes.
    meetingNotesNode = new SPNavigationNode(meetingNotes.Title, meetingNotes.DefaultViewUrl);

    // Get the Libraries heading.
    SPNavigationNode librariesHeading = web.Navigation.GetNodeById((int)SPQuickLaunchHeading.Documents);

    // If the Libraries heading does not exist or it exists but has no items below it,
    // then Meeting Notes will be the first item.
    if (librariesHeading == null || librariesHeading.Children.Count == 0)
    {
        web.Navigation.AddToQuickLaunch(meetingNotesNode, SPQuickLaunchHeading.Documents);
        return;
    }

    // The Libraries heading exists. Now check for an item linking to Shared Documents.
    // If a node for Shared Documents exists, Meeting Notes will go after it.
    SPList sharedDocs = web.Lists.TryGetList("Shared Documents");
    SPNavigationNode sharedDocsNode = null;
    if (sharedDocs != null)
        sharedDocsNode = librariesHeading
            .Children
            .Cast<SPNavigationNode>()
            .FirstOrDefault(n => n.Url == sharedDocs.DefaultViewUrl);

    // A node for Shared Documents does not exist. Make Meeting Notes the first item.
    if (sharedDocsNode == null)
    {
        librariesHeading.Children.AddAsFirst(meetingNotesNode);
        return;
    }

    // A node for Shared Documents exists. Place Meeting Notes after it.
    librariesHeading.Children.Add(meetingNotesNode, sharedDocsNode);

    web.Dispose();
}
Public Overrides Sub FeatureActivated(ByVal properties As SPFeatureReceiverProperties)

    'Get the website where the feature is activated.
    Dim web As SPWeb = TryCast(properties.Feature.Parent, SPWeb)
    If web Is Nothing Then
        Return
    End If

    ' Get the Meeting Notes document library.
    Dim meetingNotes As SPList = web.Lists.TryGetList("Meeting Notes")
    If meetingNotes Is Nothing Then

        ' Create the library if it does not exist.
        Dim listId As Guid = web.Lists.Add("Meeting Notes", "An archive for meeting notes.", SPListTemplateType.DocumentLibrary)
        meetingNotes = web.Lists.GetList(listId, False)

    End If

    ' Check for an existing Quick Launch node for Meeting Notes.
    Dim meetingNotesNode As SPNavigationNode = web.Navigation.GetNodeByUrl(meetingNotes.DefaultViewUrl)

    ' If a Meeting Notes node exists on Quick Launch, nothing more to do.
    If meetingNotesNode IsNot Nothing Then
        Return
    End If

    ' Still here, so create a node for Meeting Notes.
    meetingNotesNode = New SPNavigationNode(meetingNotes.Title, meetingNotes.DefaultViewUrl)

    ' Get the Libraries heading.
    Dim librariesHeading As SPNavigationNode = web.Navigation.GetNodeById(CInt(SPQuickLaunchHeading.Documents))

    ' If the Libraries heading does not exist or it exists but has no items below it,
    ' then Meeting Notes will be the first item.
    If librariesHeading Is Nothing OrElse librariesHeading.Children.Count = 0 Then
        web.Navigation.AddToQuickLaunch(meetingNotesNode, SPQuickLaunchHeading.Documents)
        Return
    End If

    ' The Libraries heading exists. Now check for an item linking to Shared Documents.
    ' If a node for Shared Documents exists, Meeting Notes will go after it.
    Dim sharedDocs As SPList = web.Lists.TryGetList("Shared Documents")
    Dim sharedDocsNode As SPNavigationNode = Nothing
    If sharedDocs IsNot Nothing Then
        sharedDocsNode = librariesHeading.Children.Cast(Of SPNavigationNode)().FirstOrDefault( _
            Function(n) n.Url = sharedDocs.DefaultViewUrl)
    End If

    ' A node for Shared Documents does not exist. Make Meeting Notes the first item.
    If sharedDocsNode Is Nothing Then
        librariesHeading.Children.AddAsFirst(meetingNotesNode)
        Return
    End If

    ' A node for Shared Documents exists. Place Meeting Notes after it.
    librariesHeading.Children.Add(meetingNotesNode, sharedDocsNode)

    web.Dispose()
End Sub

Добавление настраиваемого заголовка

Заголовки в меню быстрого запуска представляют собой объекты SPNavigationNode. Коллекция со всеми заголовками возвращается свойством QuickLaunch объекта Navigation веб-сайта. Чтобы добавить настраиваемый заголовок, нужно создать новый узел навигации и добавить его в коллекцию, вызвав метод класса SPNavigationNodeCollection (например, метод AddAsLast).

Добавление настраиваемого заголовка в меню быстрого запуска

  1. Создайте объект SPNavigationNode, который будет представлять собой узел навигации для нового заголовка.

    string headingTitle = "Resources";
    string headingUrl = web.Navigation.Home.Url;
    SPNavigationNode heading = new SPNavigationNode(headingTitle, headingUrl);
    
    Dim headingTitle As String = "Resources"
    Dim headingUrl As String = web.Navigation.Home.Url
    Dim heading As SPNavigationNode = New SPNavigationNode(headingTitle, headingUrl)
    
  2. Получите коллекцию узлов навигации, возвращаемую свойством QuickLaunch объекта, который возвращается свойством SPWeb.Navigation веб-сайта.

    SPNavigationNodeCollection quickLaunch = web.Navigation.QuickLaunch;
    
    Dim quickLaunch As SPNavigationNodeCollection = web.Navigation.QuickLaunch
    
  3. Добавьте новый узел заголовка в коллекцию, вызвав метод класса SPNavigationNodeCollection.

    heading = quickLaunch.AddAsLast(heading);
    
    heading = quickLaunch.AddAsLast(heading)
    

    В примере вызывается метод AddAsLast. Кроме него есть также и 2 других: метод AddAsFirst и Add.

  4. (Необязательный шаг). Добавьте элементы в заголовок, получив коллекцию, возвращаемую свойством Children нового заголовка, и еще раз вызовите метод класса SPNavigationNodeCollection.

    SPNavigationNode item = new SPNavigationNode(itemTitle, itemUrl);
    item = heading.Children.AddAsLast(item);
    
    Dim item As SPNavigationNode = New SPNavigationNode(itemTitle, itemUrl)
    item = heading.Children.AddAsLast(item)
    

Пример

В следующем примере приведено консольное приложение, создающее заголовок Resources (ресурсы) в меню быстрого запуска и добавляющее под новый заголовок элемент.

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 web = site.OpenWeb())
                {
                    string headingTitle = "Resources";
                    string headingUrl = web.Navigation.Home.Url;
                    string itemTitle = "SharePoint Developer Center";
                    string itemUrl = "https://msdn.microsoft.com/ru-ru/sharepoint";

                    // Get the Quick Launch headings.
                    SPNavigationNodeCollection ql = web.Navigation.QuickLaunch;

                    // If a Resources heading exists, get it.
                    SPNavigationNode heading = ql
                        .Cast<SPNavigationNode>()
                        .FirstOrDefault(n => n.Title == headingTitle);

                    // If the Resources heading does not exist, create it.
                    if (heading == null)
                    {
                        heading = new SPNavigationNode(headingTitle, headingUrl);
                        heading = ql.AddAsLast(heading);
                    }

                    // If the heading has a SharePoint Dev Center item, get it.
                    SPNavigationNode item = heading
                        .Children
                        .Cast<SPNavigationNode>()
                        .FirstOrDefault(n => n.Url == itemUrl);

                    // If the item does not exist, create it.
                    if (item == null)
                    {
                        item = new SPNavigationNode(itemTitle, itemUrl, true);
                        item = heading.Children.AddAsLast(item);
                    }
                 }
            }
            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()

                Dim headingTitle As String = "Resources"
                Dim headingUrl As String = web.Navigation.Home.Url
                Dim itemTitle As String = "SharePoint Developer Center"
                Dim itemUrl As String = "https://msdn.microsoft.com/ru-ru/sharepoint"

                ' Get the Quick Launch headings.
                Dim ql As SPNavigationNodeCollection = web.Navigation.QuickLaunch

                ' If a Resources heading exists, get it.
                Dim heading As SPNavigationNode = ql.Cast(Of SPNavigationNode)().FirstOrDefault( _
                    Function(n) n.Title = headingTitle)

                ' If the Resources heading does not exist, create it.
                If heading Is Nothing Then
                    heading = New SPNavigationNode(headingTitle, headingUrl)
                    heading = ql.AddAsLast(heading)
                End If

                ' If the heading has a SharePoint Dev Center item, get it.
                Dim item As SPNavigationNode = heading.Children.Cast(Of SPNavigationNode)().FirstOrDefault( _
                    Function(n) n.Url = itemUrl)

                ' If the item does not exist, create it.
                If item Is Nothing Then
                    item = New SPNavigationNode(itemTitle, itemUrl, True)
                    item = heading.Children.AddAsLast(item)
                End If

            End Using
        End Using

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

End Module

См. также

Задачи

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

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

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