Passo a passo: chamando o modelo de objeto SharePoint cliente em uma extensão Gerenciador de Servidores aplicativo

Este passo a passo demonstra como chamar o modelo de objeto SharePoint cliente de uma extensão para o nó Conexões SharePoint no Gerenciador de Servidores. Para obter mais informações sobre como usar o modelo de objeto SharePoint cliente, consulte Chamar os modelos SharePoint objeto .

Este passo a passo demonstra as seguintes tarefas:

  • Criar uma Visual Studio extensão que estende o nó SharePoint Conexões Gerenciador de Servidores das seguintes maneiras:

    • A extensão adiciona um nó da Galeria de Web Part em cada nó SharePoint site no Gerenciador de Servidores. Esse novo nó contém nós filho que representam cada Web Part na galeria da Web Part no site.

    • A extensão define um novo tipo de nó que representa uma instância da Web Part. Esse novo tipo de nó é a base para os nós filho no novo nó Galeria de Web Part. O novo tipo de nó web part exibe informações na janela Propriedades sobre a Web Part que o nó representa.

  • Criando um Visual Studio VSIX (Extensão de Visual Studio) para implantar a extensão.

  • Depurando e testando a extensão.

Observação

A extensão que você cria neste passo a passo é semelhante à extensão que você cria em Passo a passo:estender Gerenciador de Servidores para exibir web parts . Esse passo a passo usa o SharePoint de objeto do servidor, mas este passo a passo realiza as mesmas tarefas usando o modelo de objeto do cliente.

Pré-requisitos

Você precisa dos seguintes componentes no computador de desenvolvimento para concluir este passo a passo:

O conhecimento dos seguintes conceitos é útil, mas não obrigatório, para concluir o passo a passo:

Criar os projetos

Para concluir este passo a passo, você deve criar dois projetos:

  • Um projeto VSIX para criar o pacote VSIX para implantar a extensão Gerenciador de Servidores aplicativo.

  • Um projeto de biblioteca de classes que implementa a extensão Gerenciador de Servidores classe.

    Inicie o passo a passo criando os projetos.

Para criar o projeto VSIX

  1. Inicie o Visual Studio.

  2. Na barra de menus, escolha Arquivo > > Novo Project.

  3. Na caixa de diálogo Project, expanda os nós visual C# ou Visual Basic e escolha Extensibilidade.

    Observação

    O nó Extensibilidade estará disponível somente se você instalar o SDK do Visual Studio. Para obter mais informações, consulte a seção de pré-requisitos anteriormente neste tópico.

  4. Na parte superior da caixa de diálogo, .NET Framework 4.5 na lista de versões do .NET Framework.

    SharePoint extensões de ferramenta exigem recursos nesta versão do .NET Framework.

  5. Escolha o modelo de Project VSIX.

  6. Na caixa Nome, digite WebPartNode e, em seguida, escolha o botão OK.

    Visual Studio adiciona o projeto WebPartNode ao Gerenciador de Soluções.

Para criar o projeto de extensão

  1. No Gerenciador de Soluções, abra o menu de atalho para o nó da solução, escolha Adicionar e, em seguida, escolha Novo Project.

  2. Na caixa de diálogo Project, expanda os nós visual C# ou Visual Basic e escolha Windows.

  3. Na parte superior da caixa de diálogo, .NET Framework 4.5 na lista de versões do .NET Framework.

  4. Na lista de modelos de projeto, escolha Biblioteca de Classes.

  5. Na caixa Nome, insira WebPartNodeExtension e, em seguida, escolha o botão OK.

    Visual Studio adiciona o projeto WebPartNodeExtension à solução e abre o arquivo de código Class1 padrão.

  6. Exclua o arquivo de código Class1 do projeto.

Configurar o projeto de extensão

Antes de escrever código para criar a extensão, você deve adicionar arquivos de código e referências de assembly ao projeto e atualizar o namespace padrão.

Para configurar o projeto

  1. No projeto WebPartNodeExtension, adicione dois arquivos de código chamados SiteNodeExtension e WebPartNodeTypeProvider.

  2. Abra o menu de atalho do projeto WebPartNodeExtension e escolha Adicionar Referência.

  3. Na caixa de diálogo Gerenciador de Referências – WebPartNodeExtension, escolha o nó Estrutura e marque as caixas de seleção para System.ComponentModel.Composition e System. Windows. Assemblies de formulários.

  4. Escolha o nó Extensões, marque a caixa de seleção para cada um dos assemblies a seguir e, em seguida, escolha o botão OK:

    • Microsoft. SharePoint. Cliente

    • Microsoft. SharePoint. Client.Runtime

    • Microsoft.VisualStudio. SharePoint

  5. Abra o menu de atalho do projeto WebPartNodeExtension e escolha Propriedades.

    O Designer de Projeto é aberto.

  6. Escolha a guia Aplicativo.

  7. Na caixa Namespace padrão (C#) ou caixa namespace raiz (Visual Basic), insira ServerExplorer.SharePointConnections.WebPartNode.

Criar ícones para os novos nós

Crie dois ícones para a extensão Gerenciador de Servidores: um ícone para o novo nó da Galeria de Web Part e outro ícone para cada nó filho da Web Part no nó Galeria de Web Part. Mais adiante neste passo a passo, você escreverá um código que associa esses ícones aos nós.

Para criar ícones para os nós

  1. No Project Designer para o projeto WebPartNodeExtension, escolha a guia Recursos.

  2. Escolha o link Este projeto não contém um arquivo de recursos padrão. Clique aqui para criar um.

    Visual Studio cria um arquivo de recurso e o abre no designer.

  3. Na parte superior do designer, escolha a seta no comando de menu Adicionar Recurso e, em seguida, escolha Adicionar Novo Ícone.

  4. Insira WebPartsNode para o novo nome do ícone e, em seguida, escolha o botão Adicionar.

    O novo ícone é aberto no Editor de Imagens.

  5. Edite a versão 16x16 do ícone para que ele tenha um design que você possa reconhecer facilmente.

  6. Abra o menu de atalho da versão 32x32 do ícone e escolha Excluir Tipo de Imagem.

  7. Repita as etapas de 3 a 7 para adicionar um segundo ícone aos recursos do projeto e nomee esse ícone WebPart.

  8. No Gerenciador de Soluções, na pasta Recursos do projeto WebPartNodeExtension, escolha WebPartsNode.ico.

  9. Na janela Propriedades, abra a lista Ação de Build e escolha Recurso Inserido.

  10. Repita as duas últimas etapas para WebPart.ico.

Crie uma classe que adiciona o novo nó Galeria de Web Part a cada nó SharePoint site. Para adicionar o novo nó, a classe implementa a IExplorerNodeTypeExtension interface . Implemente essa interface sempre que quiser estender o comportamento de um nó existente no Gerenciador de Servidores, como adicionar um novo nó filho a um nó.

  1. Colar o código a seguir no arquivo de código SiteNodeExtension para o projeto WebPartNodeExtension.

    Observação

    Depois de adicionar esse código, o projeto terá alguns erros de compilação. Esses erros desaparecerão quando você adicionar código em etapas posteriores.

    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
    

Definir um tipo de nó que representa uma web part

Crie uma classe que define um novo tipo de nó que representa uma Web Part. Visual Studio usa esse novo tipo de nó para exibir nós filho no nó Galeria de Web Part. Cada um desses nós filho representa uma única Web Part no SharePoint site.

Para definir o novo tipo de nó, a classe implementa a IExplorerNodeTypeProvider interface . Implemente essa interface sempre que quiser definir um novo tipo de nó no Gerenciador de Servidores.

Para definir o tipo de nó da web part

  1. Colar o código a seguir no arquivo de código WebPartNodeTypeProvider para o projeto WebPartNodeExtension.

    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
    

Ponto de verificação

Neste ponto do passo a passo, todo o código para o nó Galeria de Web Part agora está no projeto. Compile o projeto WebPartNodeExtension para garantir que ele seja compilado sem erros.

Para compilar o projeto

  1. No Gerenciador de Soluções, abra o menu de atalho do projeto WebPartNodeExtension e escolha Criar.

Criar um pacote VSIX para implantar a extensão

Para implantar a extensão, use o projeto VSIX em sua solução para criar um pacote VSIX. Primeiro, configure o pacote VSIX modificando o arquivo source.extension.vsixmanifest incluído no projeto. Em seguida, crie o pacote VSIX criando a solução.

Para configurar o pacote VSIX

  1. No Gerenciador de Soluções, no projeto WebPartNode, abra o arquivo source.extension.vsixmanifest no editor de manifesto.

    O arquivo source.extension.vsixmanifest é a base para o arquivo extension.vsixmanifest que todos os pacotes VSIX exigem. Para obter mais informações sobre esse arquivo, consulte Referência do Esquema de Extensão vsIX 1.0.

  2. Na caixa Nome do Produto, insira Nó da Galeria de Web Part para Gerenciador de Servidores.

  3. Na caixa Autor, insira Contoso.

  4. Na caixa Descrição, insira Adiciona um nó personalizado da Galeria de Web Part ao nó SharePoint Conexões no Gerenciador de Servidores.

  5. Na guia Ativos do editor, escolha o botão Novo.

  6. Na caixa de diálogo Adicionar Novo Ativo, na lista Tipo, escolha Microsoft.VisualStudio.MefComponent.

    Observação

    Esse valor corresponde ao elemento MefComponent no arquivo extension.vsixmanifest. Esse elemento especifica o nome de um assembly de extensão no pacote VSIX. Para obter mais informações, consulte Elemento MEFComponent (esquema VSX).

  7. Na lista Origem, escolha Um projeto na solução atual.

  8. Na lista Project, escolha WebPartNodeExtension e, em seguida, escolha o botão OK.

  9. Na barra de menus, escolha Compilar Solução de Build e, em seguida, certifique-se de > que a solução seja compilada sem erros.

  10. Certifique-se de que a pasta de saída de build para o projeto WebPartNode agora contém o arquivo WebPartNode.vsix.

    Por padrão, a pasta de saída do build é .. \bin\Debug pasta na pasta que contém o arquivo de projeto.

Testar a extensão

Agora você está pronto para testar o novo nó da Galeria de Web Part no Gerenciador de Servidores. Primeiro, comece a depurar o projeto de extensão em uma instância experimental do Visual Studio. Em seguida, use o novo Web Parts na instância experimental do Visual Studio.

Para iniciar a depuração da extensão

  1. Reinicie Visual Studio com credenciais administrativas e abra a solução WebPartNode.

  2. No projeto WebPartNodeExtension, abra o arquivo de código SiteNodeExtension e adicione um ponto de interrupção às primeiras linhas de código nos métodos NodeChildrenRequested e CreateWebPartNodes .

  3. Escolha a tecla F5 para iniciar a depuração.

    Visual Studio instala a extensão para %UserProfile%\AppData\Local\Microsoft\VisualStudio\11.0Exp\Extensions\Contoso\Web Part Gallery Node Extension para Gerenciador de Servidores\1.0 e inicia uma instância experimental do Visual Studio. Você testará o item de projeto nesta instância do Visual Studio.

Para testar a extensão

  1. Na instância experimental do Visual Studio, na barra de menus, escolha Exibir > Gerenciador de Servidores.

  2. Verifique se o SharePoint que você deseja usar para teste aparece no nó Conexões SharePoint no Gerenciador de Servidores. Se ele não estiver listado, siga estas etapas:

    1. Abra o menu de atalho para SharePoint Conexões e, em seguida, escolha Adicionar Conexão.

    2. Na caixa de diálogo Adicionar SharePoint Conexão, insira a URL do site SharePoint ao qual você deseja se conectar e, em seguida, escolha o botão OK.

      Para especificar o site SharePoint no computador de desenvolvimento, digite http://localhost .

  3. Expanda o nó de conexão do site (que exibe a URL do seu site) e, em seguida, expanda um nó de site filho (por exemplo, Site de Equipe).

  4. Verifique se o código na outra instância do Visual Studio para no ponto de interrupção que você definiu anteriormente no método e, em seguida, escolha a tecla F5 para continuar NodeChildrenRequested a depurar o projeto.

  5. Na instância experimental do Visual Studio, expanda o nó Galeria de Web Part, que aparece sob o nó do site de nível superior.

  6. Verifique se o código na outra instância do Visual Studio para no ponto de interrupção que você definiu anteriormente no método e, em seguida, escolha a tecla F5 para continuar CreateWebPartNodes a depurar o projeto.

  7. Na instância experimental do Visual Studio, verifique se todas as Web Parts no site conectado aparecem no nó Galeria de Web Part no Gerenciador de Servidores.

  8. Abra o menu de atalho de uma Web Part e escolha Propriedades.

  9. Na janela Propriedades, verifique se os detalhes sobre a Web Part são exibidos.

  10. No Gerenciador de Servidores, abra o menu de atalho para a mesma Web Part e escolha Exibir Mensagem.

    Na caixa de mensagem exibida, escolha o botão OK.

Desinstalar a extensão do Visual Studio

Depois de concluir o teste da extensão, desinstale-a Visual Studio.

Para desinstalar a extensão

  1. Na instância experimental do Visual Studio, na barra de menus, escolha Extensões de Ferramentas > e Atualizações.

    A caixa de diálogo Extensões e Atualizações é aberta.

  2. Na lista de extensões, escolha Nó da Galeria de Web Part para Gerenciador de Servidores e, em seguida, escolha o botão Desinstalar.

  3. Na caixa de diálogo exibida, escolha o botão Sim.

  4. Escolha o botão Reiniciar Agora para concluir a desinstalação.

    O item de projeto também é desinstalado.

  5. Feche as duas instâncias de Visual Studio (a instância experimental e a instância do Visual Studio na qual a solução WebPartNode está aberta).

Confira também