SharePoint - Modelo de Objeto de Servidor

Neste capítulo, daremos uma olhada no Modelo de Objeto do SharePoint Server. Use o modelo de objeto do SharePoint Server quando estiver escrevendo o código que será executado dentro do contexto do SharePoint. Alguns exemplos comuns seriam o code-behind em uma página ou web part, manipuladores de eventos por trás de um recurso ou lista, trabalhos de timer, etc.

Recursos do modelo de objeto de servidor

A seguir estão os principais recursos do modelo de objeto de servidor

  • Você pode usar o Modelo de Objeto de Servidor se estiver programando um aplicativo ASP.NET dentro do mesmo pool de aplicativos usado pelo SharePoint.

  • O modelo de objeto do servidor pode ser usado se você estiver desenvolvendo um aplicativo cliente, como console ou formulários do Windows, ou um aplicativo WPF que será executado em um servidor SharePoint.

  • Você não pode usar o modelo de objeto de servidor para se conectar remotamente a um servidor do SharePoint.

  • Quando você quiser usar o modelo de objeto de servidor, consulte o Microsoft.SharePointmontagem. Existem outros assemblies, que compõem o Server Object Model, mas Microsoft.SharePoint é o principal.

  • Os tipos principais que você usará mais comumente são mapeados para os componentes que você usa como usuário final, de modo que itens como conjuntos de sites, sites, listas, bibliotecas e itens de lista são representados pelos tipos SPSite, SPWeb, SPList, SPDocumentLibrary e SPListItem.

  • O tipo e o modelo de objeto de servidor que representa um conjunto de sites é SPSite e o tipo que representa um site do SharePoint no modelo de objeto de servidor é SPWeb. Portanto, quando você passa dos termos do usuário final para os termos do desenvolvedor, você apenas terá que fazer esse mapeamento mental.

Agora, quando você começa a usar o SharePoint, pode ser confuso porque o site está muito sobrecarregado e significa coisas opostas nos vocabulários do usuário final e do desenvolvedor, sem mencionar o vocabulário da web.

Vamos dar uma olhada em um exemplo simples de modelo de objeto de servidor.

Step 1 - Abra o Visual Studio e crie um novo projeto a partir de File → New → Project opção de menu.

Step 2 - Selecione Windows de Templates → Visual C#no painel esquerdo e escolha Aplicativo de console no painel do meio. Insira o nome do seu projeto e clique em OK.

Step 3 - Uma vez que o projeto é criado, clique com o botão direito no projeto no Solution Explorer e selecione Add → References.

Step 4 - Selecione Assemblies → Extensions no painel esquerdo e marque Microsoft.SharePoint no painel do meio e clique no botão OK.

Agora, clique com o botão direito novamente no projeto no Solution Explorer e selecione Propriedades.

Step 5 - Clique no Build Tab no painel esquerdo e desmarque o Prefer 32-bit opção.

Step 6 - Agora volte para o Program.cs arquivo e substitua-o pelo código a seguir.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SharePointData {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            Console.WriteLine(web.Title);
            var lists = web.Lists;
            
            foreach (SPList list in lists) {
               Console.WriteLine("\t" + list.Title);
            }
            Console.ReadLine();
         }
      }
   }
}

Note- No código acima, primeiro criou um novo objeto SPSite. Este é um objeto descartável, portanto, é criado dentro de uma instrução using. O construtor SPSite leva a URL para o conjunto de sites, que será diferente no seu caso.

O var web = site.RootWeb obterá a raiz do conjunto de sites.

Podemos obter as listas usando web.Lists e imprimir o título dos itens da lista.

Quando o código acima for compilado e executado, você verá a seguinte saída -

SharePoint Tutorials
   appdata
   Authors
   Composed Looks
   Contacts
   Course Documents
   Courses
   Documents
   List Template Gallery
   Master Page Gallery
   Site Assets
   Site Pages
   Solution Gallery
   Style Library
   Theme Gallery
   User Information List
   Web Part Gallery

Você pode ver que esses títulos são Galeria de soluções, Biblioteca de estilos, Modelos de formulários. Essas são listas usadas internamente pelo SharePoint. Portanto, em vez de exibir todas as listas, talvez você queira apenas mostrar as listas que os usuários normalmente veriam.

Portanto, em vez de obter a coleção de lista inteira, queremos obter todas as listas que não estão ocultas. Podemos fazer isso usando uma consulta de link conforme fornecido abaixo.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            Console.WriteLine(web.Title);
            var lists = from SPList list in web.Lists
            where list.Hidden == false
            select list;
            
            foreach (SPList list in lists) {
               Console.WriteLine("\t" + list.Title);
            }
            Console.ReadLine();
         }
      }
   }
}

Quando o código acima for compilado e executado, você verá a seguinte saída -

SharePoint Tutorials
   Authors
   Contacts
   Course Documents
   Courses
   Documents
   Site Assets
   Site Pages
   Style Library

Você pode ver que isso nos devolverá todas as listas que não estão ocultas.

Vamos dar uma olhada em outro exemplo simples no qual também exibiremos algumas informações sobre os itens da lista.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            Console.WriteLine(web.Title);
            var lists = from SPList list in web.Lists
            where list.Hidden == false
            select list;
            
            foreach (SPList list in lists) {
               Console.WriteLine("\t" + list.Title);
               var items = list.Items.OfType<SPListItem>().Take(5);
               var isDocLib = list is SPDocumentLibrary;
               
               foreach (SPListItem item in items) {
                  var value = isDocLib ? item.Name : item.Title;
                  Console.WriteLine("\t\t" + value);
               }
            }
            Console.ReadLine();
         }
      }
   }
}

Quando o código acima for compilado e executado, você verá a seguinte saída -

SharePoint Tutorials
   Authors
      Muhammad Waqas
      Mark Upston
      Allan Bommer
      Andy Onian
   Contacts
      Waqas
      Upston
      Bommer
   Course Documents
      Sample1.docx
      Sample2.docx
      Sample3.docx
   Courses
      SharePoint Tutorials
      C# Tutorials
      ASP.Net Tutorials
      NHibernate Tutorials
   Documents
   Site Assets
   Site Pages
      Home.aspx
      How To Use This Library.aspx
   Style Library

Dados da lista

Quando você cria uma lista pela primeira vez, ela sempre tem uma coluna de título. Esta coluna Título dá acesso, por padrão, ao contexto do Item da Lista ou ao menu de blocos de controle de edição.

Uma vez que, toda lista começa com uma coluna - Título, o SPListItemtipo expõe isso como uma propriedade. Para as colunas que não são comuns a todas as listas, você pode acessá-las por meio do indexador emSpListItem tipo.

Você pode passar algumas informações para o indexador, mas a mais comum é a Column. Os usuários finais nas configurações da lista podem alterar esse nome. Você não deseja usar este nome porque, novamente, ele pode mudar.

O segundo é o InternalName, que é definido no ponto em que esta lista é criada e nunca muda. Este é o nome que você deseja usar ao acessar o valor da coluna.

Vamos dar uma olhada em um exemplo simples em que recuperaremos a lista de Autores conforme mostrado abaixo -

Neste exemplo, obteremos a lista de Autores e então aumentaremos o Salário / Taxa em algum valor. Portanto, para a coluna Salário / Taxa, usaremos oInternalName.

Step 1- Vá para o Server Explorer; clique com o botão direitoSharePoint Connections e selecione Adicionar conexão ... Especifique o URL e clique em OK.

Step 2 - Expandir SharePoint Tutorials → List Libraries → Lists → Authors → Fields → Salary/Ratecampo. Clique com o botão direitoSalary/Ratee selecione Propriedades. Você verá oInternalName na janela Propriedades.

Step 3 - A seguir está um exemplo simples de recuperar os Autores com base no Salário / Taxa e aumentar seu Salário / Taxa.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            var list = web.Lists.TryGetList("Authors");
            if (list == null)
            return;
            var items = list.Items;
            ShowItems(items);
            RaiseRates(items);
            Console.WriteLine("\nAfter Raise\n");
            ShowItems(items);
            Console.ReadKey();
         }
      }
      static void RaiseRates(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            var employee = Convert.ToBoolean(item["Employee"]);
            var rate = Convert.ToDouble(item["Salary_x002f_Rate"]);
            var newRate = employee ? rate + 1 : rate + 0.1;
            item["Salary_x002f_Rate"] = newRate;
            item.Update();
         }
      }
      static void ShowItems(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            Console.WriteLine("Salary or rate for {0} is {1:c}", item.Title,
            item["Salary_x002f_Rate"]);
         }
      }
   }
}

No código acima, você pode ver que temos dois métodos -

  • Um está recuperando a lista que é chamada ShowItems e

  • O outro método é aumentar as taxas, que é chamado RaiseRates().

Quando o código acima for compilado e executado, você verá a seguinte saída -

Salary or rate for Muhammad Waqas is $950.00
Salary or rate for Mark Upston is $15.00
Salary or rate for Allan Bommer is $20.00
Salary or rate for Andy Onian is $870.00

After Raise

Salary or rate for Muhammad Waqas is $951.00
Salary or rate for Mark Upston is $15.10
Salary or rate for Allan Bommer is $20.10
Salary or rate for Andy Onian is $871.00

Consultas CAML

Nos exemplos acima, sempre iteramos pelos itens usando um loop foreach muitas vezes iterando por todos os itens e sempre trouxemos de volta todas as colunas ou pelo menos todas as colunas estavam acessíveis.

É realmente análogo a fazer um select * from nome da tabela em uma consulta SQL.

Podemos resolver esse problema usando o que chamamos CAML queries. Ao fazer uma consulta CAML, você tem duas opções -

  • Se você deseja consultar apenas uma única lista, pode usar o objeto SPQuery.

  • Se você deseja consultar várias listas em um conjunto de sites, pode usar o SPSiteDataQuery.

Geralmente, quando você está fazendo o SPSiteDataQuery, você está consultando todas as listas de um tipo específico.

Por exemplo, desejo consultar todas as listas de contato etc. SPSiteDataQuery permite determinar o escopo, portanto, você pode indicar que deseja consultar todo o conjunto de sites, um site individual ou o site e todos os seus filhos.

A sintaxe para consultas CAML é basicamente descrita no formato XML e leva um pouco de tempo para se acostumar a construir esses tipos de consultas.

Vamos dar uma olhada em um exemplo simples de Consultas CAML. Aqui, criaremos uma consulta CAML para consultar os dados em nossa lista de Autores.

using Microsoft.SharePoint;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ServerObjectModel {
   class Program {
      static void Main(string[] args) {
         using (var site = new SPSite("http://waqasserver/sites/demo")) {
            var web = site.RootWeb;
            var list = web.Lists.TryGetList("Authors");
            if (list == null)
            return;
            var items = QueryItems(list);
            ShowItems(items);
            
            //RaiseRates(items);
            //Console.WriteLine("\nAfter Raise\n");
            //ShowItems(items);
            Console.ReadKey();
         }
      }
      static SPListItemCollection QueryItems(SPList list) {
         var query = new SPQuery();
         
         query.ViewFields =
            "<FieldRef Name='Title' />" +
            "<FieldRef Name='Employee' />" +
            "<FieldRef Name='Salary_x002f_Rate' />";
         
         query.Query =
            "<OrderBy>" +
            " <FieldRef Name='Salary_x002f_Rate' />" +
            "</OrderBy>" +
            "<Where>" +
            " <Eq>" +
            " <FieldRef Name='Employee' />" +
            " <Value Type='Boolean'>False</Value>" +
            " </Eq>" +
            "</Where>";
         return list.GetItems(query);
      }
      static void RaiseRates(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            var employee = Convert.ToBoolean(item["Employee"]);
            var rate = Convert.ToDouble(item["Salary_x002f_Rate"]);
            var newRate = employee ? rate + 1 : rate + 0.1;
            item["Salary_x002f_Rate"] = newRate;
            item.Update();
         }
      }
      static void ShowItems(SPListItemCollection items) {
         foreach (SPListItem item in items) {
            Console.WriteLine("Salary or rate for {0} is {1:c}",
            item.Title,
            item["Salary_x002f_Rate"]);
         }
      }
   }
}

Usamos uma consulta CAML para obter alguns dos itens. NoQueryItems , você pode ver que recuperamos apenas os itens que não são Funcionário.

Salary or rate for Mark Upston is $15.10
Salary or rate for Allan Bommer is $20.10