пошаговое руководство. вызов клиентской объектной модели SharePoint в расширении обозреватель сервера

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

В этом пошаговом руководстве описаны следующие задачи.

  • создание Visual Studio расширения, расширяющего узел SharePoint соединений обозреватель сервера , следующим образом.

    • расширение добавляет узел коллекции веб-частей в каждый узел SharePoint сайта в обозреватель сервера. Этот новый узел содержит дочерние узлы, представляющие каждую веб-часть в галерее веб-частей на сайте.

    • Расширение определяет новый тип узла, представляющий экземпляр веб-части. Этот новый тип узла является основанием для дочерних узлов в новом узле коллекции веб-частей . Новый тип узла веб-части отображает сведения в окне Свойства о веб-части, которую представляет узел.

  • создание пакета расширения Visual Studio (VSIX) для развертывания расширения.

  • Отладка и тестирование расширения.

Примечание

Расширение, создаваемое в этом пошаговом руководстве, напоминает расширение, созданное в разделе Пошаговое руководство. расширение обозреватель сервера для показа веб-частей. в этом пошаговом руководстве используется объектная модель сервера SharePoint, но в этом пошаговом руководстве выполняются те же задачи с помощью клиентской объектной модели.

Предварительные условия

Для выполнения этого пошагового руководства на компьютере разработчика потребуются следующие компоненты:

  • поддерживаемые выпуски Windows, SharePoint и Visual Studio.

  • пакет SDK для Visual Studio. в этом пошаговом руководстве используется шаблон vsix Project в пакете SDK для создания пакета vsix для развертывания расширения. дополнительные сведения см. в разделе расширение средств SharePoint в Visual Studio.

Знания следующих концепций полезны, но не требуются для выполнения этого пошагового руководства.

Создание проектов

Для выполнения этого пошагового руководства необходимо создать два проекта:

  • Проект VSIX для создания пакета VSIX для развертывания расширения Обозреватель сервера .

  • Проект библиотеки классов, реализующий расширение Обозреватель сервера .

    Начните пошаговое руководство, создав проекты.

Создание проекта VSIX

  1. Запустите среду Visual Studio.

  2. В строке меню выберите Файл > Создать > Проект.

  3. в диалоговом окне создание Project разверните узлы Visual C# или Visual Basic , а затем выберите расширяемость.

    Примечание

    узел расширяемости доступен только при установке пакета SDK для Visual Studio. Дополнительные сведения см. в разделе Предварительные требования ранее в этом разделе.

  4. в верхней части диалогового окна выберите платформа .NET Framework 4,5 в списке версий платформа .NET Framework.

    для расширений инструментов SharePoint требуются функции в этой версии платформа .NET Framework.

  5. выберите шаблон VSIX Project .

  6. В поле имя введите вебпартноде, а затем нажмите кнопку ОК .

    Visual Studio Добавляет проект вебпартноде в Обозреватель решений.

Создание проекта расширения

  1. В Обозреватель решений откройте контекстное меню узла решения, выберите Добавить, а затем выберите создать Project.

  2. в диалоговом окне создание Project разверните узлы Visual C# или Visual Basic , а затем выберите Windows.

  3. в верхней части диалогового окна выберите платформа .NET Framework 4,5 в списке версий платформа .NET Framework.

  4. В списке шаблонов проектов выберите Библиотека классов.

  5. В поле имя введите вебпартнодикстенсион, а затем нажмите кнопку ОК .

    Visual Studio Добавляет проект вебпартнодикстенсион в решение и открывает файл кода Class1 по умолчанию.

  6. Удалите файл кода Class1 из проекта.

Настройка проекта расширения

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

Настройка проекта

  1. В проекте вебпартнодикстенсион добавьте два файла кода с именами Ситенодикстенсион и вебпартнодетипепровидер.

  2. Откройте контекстное меню проекта Вебпартнодикстенсион и выберите команду Добавить ссылку.

  3. В диалоговом окне Диспетчер ссылок — вебпартнодикстенсион выберите узел платформа , а затем установите флажки для System. ComponentModel. композиция и System. Windows. Сборки форм.

  4. Выберите узел расширения , установите флажки для каждой из следующих сборок, а затем нажмите кнопку ОК :

    • NNTP. SharePoint. Компьютера

    • NNTP. SharePoint. Client. Runtime

    • Microsoft. VisualStudio. SharePoint

  5. Откройте контекстное меню проекта вебпартнодикстенсион и выберите пункт свойства.

    Открывается Конструктор проектов.

  6. Перейдите на вкладку Приложение.

  7. в поле пространства имен по умолчанию (C#) или корневое пространство имен (Visual Basic) введите ServerExplorer. шарепоинтконнектионс. вебпартноде.

Создание значков для новых узлов

Создайте два значка для расширения Обозреватель сервера : значок для нового узла коллекции веб-частей и другой значок для каждого дочернего узла веб-части в узле коллекции веб-частей . Далее в этом пошаговом руководстве будет написан код, связывающий эти значки с узлами.

Создание значков для узлов

  1. в конструкторе Project для проекта вебпартнодикстенсион перейдите на вкладку ресурсы .

  2. Выберите ссылку этот проект не содержит файл ресурсов по умолчанию. Щелкните здесь, чтобы создать его.

    Visual Studio создает файл ресурсов и открывает его в конструкторе.

  3. В верхней части конструктора щелкните стрелку в меню Добавить ресурс , а затем выберите команду Добавить новый значок.

  4. Введите вебпартсноде в поле имя нового значка, а затем нажмите кнопку Добавить .

    В редакторе изображений откроется новый значок.

  5. Измените значок значка 16x16, чтобы он был понятен для проекта.

  6. Откройте контекстное меню для версии 32x32 значка, а затем выберите удалить тип изображения.

  7. Повторите шаги с 3 по 7, чтобы добавить второй значок в ресурсы проекта, и назовите эту веб-часть значка.

  8. В Обозреватель решений в папке Resources для проекта вебпартнодикстенсион выберите вебпартсноде. ico.

  9. В окне Свойства откройте список действие сборки и выберите пункт внедренный ресурс.

  10. Повторите последние два шага для WebPart. ico.

создайте класс, который добавляет новый узел коллекции веб-частей в каждый узел SharePoint сайта. Чтобы добавить новый узел, класс реализует IExplorerNodeTypeExtension интерфейс. Реализуйте этот интерфейс всякий раз, когда требуется расширить поведение существующего узла в Обозреватель сервера, например добавить новый дочерний узел в узел.

  1. Вставьте следующий код в файл кода ситенодикстенсион для проекта вебпартнодикстенсион .

    Примечание

    После добавления этого кода в проекте будут обнаружены ошибки компиляции. Эти ошибки исчезнут при добавлении кода в последующих шагах.

    using System.Collections.Generic;
    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.SharePoint.Explorer;
    
    namespace ServerExplorer.SharePointConnections.WebPartNode
    {
        // Enables Visual Studio to discover and load this extension.
        [Export(typeof(IExplorerNodeTypeExtension))]        
    
        // Indicates that this class extends SharePoint site nodes in Server Explorer.
        [ExplorerNodeType(ExplorerNodeTypes.SiteNode)]
    
        // Represents an extension of SharePoint site nodes in Server Explorer.
        internal class SiteNodeExtension : IExplorerNodeTypeExtension
        {
            public void Initialize(IExplorerNodeType nodeType)
            {
                // The NodeChildrenRequested event is raised when the user expands the
                // SharePoint site node in Server Explorer.
                nodeType.NodeChildrenRequested += NodeChildrenRequested;
            }
    
            // Creates the new Web Part Gallery node with the specified icon.
            private void NodeChildrenRequested(object sender, ExplorerNodeEventArgs e)
            {
                // The CreateWebPartNodes argument is a delegate that Visual Studio calls 
                // to create the child nodes under the Web Part Gallery node.
                e.Node.ChildNodes.AddFolder("Web Part Gallery",
                    Properties.Resources.WebPartsNode.ToBitmap(), CreateWebPartNodes);
            }
    
            // Creates all of the individual Web Part nodes under the new Web Part Gallery node.
            private void CreateWebPartNodes(IExplorerNode parentNode)
            {
                // Call the custom SharePoint command to get items from the Web Part gallery.
                var webParts = parentNode.Context.SharePointConnection.ExecuteCommand<WebPartNodeInfo[]>(
                    WebPartCommandIds.GetWebParts);
    
                if (webParts != null)
                {
                    foreach (WebPartNodeInfo webPart in webParts)
                    {
                        // Create a new annotation object to store the current Web Part item with the new node.
                        var annotations = new Dictionary<object, object>() 
                        { 
                            { typeof(WebPartNodeInfo), webPart } 
                        };
    
                        // Create the new node for the current Web Part item.
                        parentNode.ChildNodes.Add(WebPartNodeTypeProvider.WebPartNodeTypeId,
                            webPart.Name, annotations);
                    }
                }
            }
        }
    }
    
    Imports System.Collections.Generic
    Imports System.ComponentModel.Composition
    Imports Microsoft.SharePoint.Client
    Imports Microsoft.VisualStudio.SharePoint
    Imports Microsoft.VisualStudio.SharePoint.Explorer
    
    Namespace ServerExplorer.SharePointConnections.WebPartNode
    
        ' Export attribute: Enables Visual Studio to discover and load this extension.
        ' ExplorerNodeType attribute: Indicates that this class extends SharePoint site nodes in Server Explorer.
        ' SiteNodeExtension class: Represents an extension of SharePoint site nodes in Server Explorer.
        <Export(GetType(IExplorerNodeTypeExtension))> _
        <ExplorerNodeType(ExplorerNodeTypes.SiteNode)> _
        Friend Class SiteNodeExtension
            Implements IExplorerNodeTypeExtension
    
            Private siteUrl As System.Uri = Nothing
    
            Private Sub Initialize(ByVal nodeType As IExplorerNodeType) _
                Implements IExplorerNodeTypeExtension.Initialize
    
                ' The NodeChildrenRequested event is raised when the user expands the
                ' SharePoint site node in Server Explorer.
                AddHandler nodeType.NodeChildrenRequested, AddressOf NodeChildrenRequested
            End Sub
    
            ' Creates the new Web Part Gallery node with the specified icon.
            Private Sub NodeChildrenRequested(ByVal Sender As Object, ByVal e As ExplorerNodeEventArgs)
    
                ' Get the site URL so that it can be used later to access the site
                ' by using the SharePoint client object model.
                siteUrl = e.Node.Context.SiteUrl
    
                ' The CreateWebPartNodes argument is a delegate that Visual Studio calls 
                ' to create the child nodes under the Web Part Gallery node.
                e.Node.ChildNodes.AddFolder("Web Part Gallery", My.Resources.WebPartsNode.ToBitmap(), _
                    AddressOf CreateWebPartNodes)
            End Sub
    
            ' Creates individual Web Part nodes under the new Web Part Gallery node.
            Private Sub CreateWebPartNodes(ByVal parentNode As IExplorerNode)
    
                ' Use the SharePoint client object model to get items from the Web Part gallery.
                Dim Context As ClientContext = New ClientContext(siteUrl.AbsoluteUri)
                Dim WebPartsGallery As List = Context.Web.GetCatalog(CType(ListTemplateType.WebPartCatalog, Integer))
                Dim WebParts As ListItemCollection = WebPartsGallery.GetItems(New CamlQuery())
    
                ' Request the FieldValuesAsText property values with the Web Part items.
                Context.Load(WebParts, Function(listItems) listItems.Include(Function(i) i.FieldValuesAsText))
                Context.ExecuteQuery()
    
                If WebParts IsNot Nothing Then
                    For Each WebPart As ListItem In WebParts
    
                        ' Create a new annotation object to store the current Web Part item with the new node.
                        Dim Annotations = New Dictionary(Of Object, Object)()
                        Annotations.Add(GetType(ListItem), WebPart)
    
                        ' Create the new node for the current Web Part item.
                        parentNode.ChildNodes.Add(WebPartNodeTypeProvider.WebPartNodeTypeId, _
                            WebPart.FieldValuesAsText.FieldValues("Title"), Annotations)
                    Next
                End If
            End Sub
        End Class
    End Namespace
    

Определение типа узла, представляющего веб-часть

Создайте класс, определяющий новый тип узла, представляющий веб-часть. Visual Studio использует этот новый тип узла для показа дочерних узлов в узле коллекции веб-частей . каждый из этих дочерних узлов представляет собой отдельную веб-часть на SharePoint сайте.

Чтобы определить новый тип узла, класс реализует IExplorerNodeTypeProvider интерфейс. Реализуйте этот интерфейс всякий раз, когда нужно определить новый тип узла в Обозреватель сервера.

Определение типа узла веб-части

  1. Вставьте следующий код в файл кода вебпартнодетипепровидер для проекта вебпартнодикстенсион .

    using System;
    using System.Collections.Generic;
    using System.Windows.Forms;
    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.SharePoint;
    using Microsoft.VisualStudio.SharePoint.Explorer;
    
    namespace ServerExplorer.SharePointConnections.WebPartNode
    {
        // Enables Visual Studio to discover and load this extension.
        [Export(typeof(IExplorerNodeTypeProvider))]
    
        // Specifies the ID for this new node type.
        [ExplorerNodeType(WebPartNodeTypeProvider.WebPartNodeTypeId)]
    
        // Defines a new node type that represents a Web Part on a SharePoint site.
        internal class WebPartNodeTypeProvider : IExplorerNodeTypeProvider
        {
            internal const string WebPartNodeTypeId = "Contoso.WebPart";
    
            public void InitializeType(IExplorerNodeTypeDefinition typeDefinition)
            {
                typeDefinition.DefaultIcon = Properties.Resources.WebPart.ToBitmap();
                typeDefinition.IsAlwaysLeaf = true;
                typeDefinition.NodePropertiesRequested += NodePropertiesRequested;
            }
    
            // Retrieves properties that are displayed in the Properties window when
            // a Web Part node is selected.
            private void NodePropertiesRequested(object sender,
                ExplorerNodePropertiesRequestedEventArgs e)
            {
                var webPartNodeInfo = e.Node.Annotations.GetValue<WebPartNodeInfo>();
    
                // Call the custom SharePoint command to get the Web Part properties.
                Dictionary<string, string> properties =
                    e.Node.Context.SharePointConnection.ExecuteCommand<
                    WebPartNodeInfo, Dictionary<string, string>>(
                    WebPartCommandIds.GetWebPartProperties, webPartNodeInfo);
    
                object propertySource = e.Node.Context.CreatePropertySourceObject(properties);
                e.PropertySources.Add(propertySource);
            }
        }
    }
    
    Imports System
    Imports System.Collections.Generic
    Imports System.Windows.Forms
    Imports System.ComponentModel.Composition
    Imports Microsoft.SharePoint.Client
    Imports Microsoft.VisualStudio.SharePoint
    Imports Microsoft.VisualStudio.SharePoint.Explorer
    
    Namespace ServerExplorer.SharePointConnections.WebPartNode
    
        ' Export attribute: Enables Visual Studio to discover and load this extension.
        ' ExplorerNodeType attribute: Specifies the ID for this new node type.
        ' WebPartNodeTypeProvider class: Defines a new node type that represents a Web Part on a SharePoint site.
        <Export(GetType(IExplorerNodeTypeProvider))> _
        <ExplorerNodeType(WebPartNodeTypeProvider.WebPartNodeTypeId)> _
        Friend Class WebPartNodeTypeProvider
            Implements IExplorerNodeTypeProvider
    
            Friend Const WebPartNodeTypeId As String = "Contoso.WebPart"
    
            Private Sub InitializeType(ByVal typeDefinition As IExplorerNodeTypeDefinition) _
            Implements IExplorerNodeTypeProvider.InitializeType
                typeDefinition.DefaultIcon = My.Resources.WebPart.ToBitmap()
                typeDefinition.IsAlwaysLeaf = True
    
                AddHandler typeDefinition.NodePropertiesRequested, AddressOf NodePropertiesRequested
                AddHandler typeDefinition.NodeMenuItemsRequested, AddressOf NodeMenuItemsRequested
            End Sub
    
            ' Retrieves properties that are displayed in the Properties window when
            ' a Web Part node is selected.
            Private Sub NodePropertiesRequested(ByVal Sender As Object, _
                ByVal e As ExplorerNodePropertiesRequestedEventArgs)
    
                Dim webPart = e.Node.Annotations.GetValue(Of ListItem)()
                Dim propertySource = e.Node.Context.CreatePropertySourceObject( _
                    webPart.FieldValuesAsText.FieldValues)
                e.PropertySources.Add(propertySource)
            End Sub
    
            Private Sub NodeMenuItemsRequested(ByVal Sender As Object, _
                ByVal e As ExplorerNodeMenuItemsRequestedEventArgs)
                Dim WebPartNodeMenuItem As IMenuItem = e.MenuItems.Add("Display Message")
                AddHandler WebPartNodeMenuItem.Click, AddressOf MenuItemClick
            End Sub
    
            Private Sub MenuItemClick(ByVal Sender As Object, ByVal e As MenuItemEventArgs)
                Dim ParentNode As IExplorerNode = TryCast(e.Owner, IExplorerNode)
                If ParentNode IsNot Nothing Then
                    Dim webPart = ParentNode.Annotations.GetValue(Of ListItem)()
                    MessageBox.Show("You clicked the context menu for the following Web part: " & _
                        webPart.FieldValuesAsText.FieldValues("Title") + ".", "Web Part Menu Command")
                End If
            End Sub
        End Class
    End Namespace
    

Контрольная точка

На этом этапе в этом пошаговом руководстве весь код для узла коллекции веб-частей теперь находится в проекте. Выполните сборку проекта вебпартнодикстенсион , чтобы убедиться, что компиляция выполняется без ошибок.

Построение проекта

  1. В Обозреватель решений откройте контекстное меню проекта вебпартнодикстенсион и выберите пункт Сборка.

Создание пакета VSIX для развертывания расширения

Чтобы развернуть расширение, используйте проект VSIX в решении для создания пакета VSIX. Сначала настройте пакет VSIX, изменив файл Source. extension. vsixmanifest, который входит в проект. Затем создайте пакет VSIX, создав решение.

Настройка пакета VSIX

  1. В Обозреватель решений в проекте вебпартноде откройте файл source. extension. vsixmanifest в редакторе манифеста.

    Файл Source. extension. vsixmanifest является основанием для файла Extension. vsixmanifest, который требуются для всех пакетов VSIX. Дополнительные сведения об этом файле см. в разделе Справочник по схеме расширения VSIX 1,0.

  2. В поле имя продукта введите узел коллекции веб-частей для обозреватель сервера.

  3. В поле Author (автор ) введите contoso.

  4. в поле описание введите добавление пользовательского узла коллекции веб-частей в узел SharePoint подключения в обозреватель сервера.

  5. На вкладке ресурсы редактора нажмите кнопку создать .

  6. В диалоговом окне Добавление нового ресурса в списке Тип выберите Microsoft. VisualStudio. MefComponent.

    Примечание

    Это значение соответствует MefComponent элементу в файле Extension. vsixmanifest. Этот элемент задает имя сборки расширения в пакете VSIX. Дополнительные сведения см. в разделе элемент MEFComponent (Схема VSX).

  7. В списке источник выберите проект в текущем решении.

  8. в списке Project выберите вебпартнодикстенсион, а затем нажмите кнопку ок .

  9. В строке меню выберите Сборка > сборка решения и убедитесь, что решение компилируется без ошибок.

  10. Убедитесь, что папка выходных данных сборки для проекта Вебпартноде теперь содержит файл Вебпартноде. VSIX.

    По умолчанию выходной папкой сборки является.. \bin\Debug в папке, содержащей файл проекта.

Тестирование расширения

Теперь вы можете протестировать новый узел коллекции веб-частей в Обозреватель сервера. Сначала начните отладку проекта расширения в экспериментальном экземпляре Visual Studio. затем используйте новый узел веб-части в экспериментальном экземпляре Visual Studio.

Запуск отладки расширения

  1. перезапустите Visual Studio с учетными данными администратора, а затем откройте решение вебпартноде .

  2. В проекте Вебпартнодикстенсион откройте файл кода ситенодикстенсион , а затем добавьте точку останова в первую строку кода в NodeChildrenRequested CreateWebPartNodes методах и.

  3. Нажмите клавишу F5 , чтобы начать отладку.

    Visual Studio устанавливает расширение для узла коллекции частей%UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Web для сервера Explorer\1.0 и запускает экспериментальный экземпляр Visual Studio. Вы протестируете элемент проекта в этом экземпляре Visual Studio.

Тестирование расширения

  1. в экспериментальном экземпляре Visual Studio в строке меню выберите вид > обозреватель сервера.

  2. убедитесь, что SharePoint сайт, который вы хотите использовать для тестирования, отображается в узле подключения SharePoint в обозреватель сервера. Если он отсутствует в списке, выполните следующие действия.

    1. откройте контекстное меню для SharePoint подключения и выберите команду добавить подключение.

    2. в диалоговом окне добавление SharePoint соединения введите URL-адрес сайта SharePoint, к которому необходимо подключиться, а затем нажмите кнопку ок .

      чтобы указать SharePoint сайт на компьютере разработчика, введите http://localhost .

  3. Разверните узел подключение к сайту (который отображает URL-адрес сайта), а затем разверните узел дочернего сайта (например, сайт группы).

  4. убедитесь, что код в другом экземпляре Visual Studio остановлен на точке останова, заданной ранее в NodeChildrenRequested методе, а затем нажмите клавишу F5 , чтобы продолжить отладку проекта.

  5. в экспериментальном экземпляре Visual Studio разверните узел коллекция веб-частей , который отображается под узлом сайта верхнего уровня.

  6. убедитесь, что код в другом экземпляре Visual Studio остановлен на точке останова, заданной ранее в CreateWebPartNodes методе, а затем нажмите клавишу F5 , чтобы продолжить отладку проекта.

  7. в экспериментальном экземпляре Visual Studio убедитесь, что все веб-части на подключенном сайте отображаются в узле коллекция веб-частей в обозреватель сервера.

  8. Откройте контекстное меню веб-части и выберите пункт Свойства.

  9. В окне Свойства убедитесь, что отображаются сведения о веб-части.

  10. В Обозреватель сервера откройте контекстное меню той же веб-части и выберите пункт Показать сообщение.

    В появившемся окне сообщения нажмите кнопку ОК .

Удаление расширения из Visual Studio

После завершения тестирования расширения удалите его из Visual Studio.

Удаление расширения

  1. в экспериментальном экземпляре Visual Studio в строке меню выберите инструменты > расширения и обновления.

    Появится диалоговое окно Расширения и обновления.

  2. В списке расширений выберите узел Коллекция веб-частей для обозреватель сервера, а затем нажмите кнопку Удалить .

  3. В появившемся диалоговом окне нажмите кнопку Да .

  4. Нажмите кнопку Перезагрузить сейчас , чтобы завершить удаление.

    Элемент проекта также удаляется.

  5. закройте оба экземпляра Visual Studio (экспериментальный экземпляр и экземпляр Visual Studio, в котором открыто решение вебпартноде).

См. также