SharePoint: modelo de objetos de servidor

En este capítulo, veremos el modelo de objetos de SharePoint Server. Utilice el modelo de objetos de SharePoint Server cuando escriba código que se ejecutará dentro del contexto de SharePoint. Algunos ejemplos comunes serían el código subyacente en una página o un elemento web, los controladores de eventos detrás de una característica o una lista, trabajos de temporizador, etc.

Características del modelo de objetos de servidor

Las siguientes son las características clave del modelo de objetos de servidor

  • Puede usar el modelo de objetos de servidor si está programando una aplicación ASP.NET dentro del mismo grupo de aplicaciones que usa SharePoint.

  • El modelo de objetos de servidor se puede usar si está desarrollando una aplicación cliente como una consola o formularios de Windows o una aplicación WPF que se ejecutará en un servidor de SharePoint.

  • No puede usar el modelo de objetos de servidor para conectarse de forma remota a un servidor de SharePoint.

  • Cuando desee utilizar el modelo de objetos de servidor, consulte la Microsoft.SharePointmontaje. Hay otros ensamblados, que componen el Modelo de objetos de servidor, pero Microsoft.SharePoint es el principal.

  • Los tipos principales que usará con más frecuencia se asignan a los componentes que usa como usuario final, por lo que elementos como colecciones de sitios, sitios, listas, bibliotecas y elementos de listas se representan mediante los tipos SPSite, SPWeb, SPList, SPDocumentLibrary y SPListItem.

  • El tipo y el modelo de objetos de servidor que representa una colección de sitios es SPSite y el tipo que representa un sitio de SharePoint en el modelo de objetos de servidor es SPWeb. Por lo tanto, cuando pase de los términos del usuario final a los términos del desarrollador, solo tendrá que hacer ese mapeo mental.

Ahora, cuando comienza a usar SharePoint por primera vez, puede ser confuso porque el sitio está muy sobrecargado y significa cosas opuestas en el vocabulario del usuario final y del desarrollador, sin mencionar el vocabulario web.

Echemos un vistazo a un ejemplo simple de modelo de objetos de servidor.

Step 1 - Abra Visual Studio y cree un nuevo proyecto desde File → New → Project opción de menú.

Step 2 - Seleccione Windows de Templates → Visual C#en el panel izquierdo y elija Aplicación de consola en el panel central. Ingrese el nombre de su proyecto y haga clic en Aceptar.

Step 3 - Una vez creado el proyecto, haga clic con el botón derecho en el proyecto en el Explorador de soluciones y seleccione Add → References.

Step 4 - Seleccionar Assemblies → Extensions en el panel izquierdo y marque Microsoft.SharePoint en el panel central y haga clic en el botón Aceptar.

Ahora haga clic derecho nuevamente en el proyecto en el Explorador de soluciones y seleccione Propiedades.

Step 5 - Haga clic en el Build Pestaña en el panel izquierdo y desmarca la Prefer 32-bit opción.

Step 6 - Ahora vuelve al Program.cs archivo y reemplácelo con el siguiente código.

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- En el código anterior primero se creó un nuevo objeto SPSite. Este es un objeto desechable, por lo que se crea dentro de una declaración de uso. El constructor de SPSite toma la URL de la colección de sitios, que será diferente en su caso.

La var web = site.RootWeb obtendrá la raíz de la colección de sitios.

Podemos obtener las listas usando web.Lists e imprimir el título de los elementos de la lista.

Cuando se compile y ejecute el código anterior, verá el siguiente resultado:

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

Puede ver que estos títulos son Galería de soluciones, Biblioteca de estilo, Plantillas de formulario. Estas son listas que SharePoint usa internamente. Por lo tanto, en lugar de mostrar todas las listas, tal vez solo desee mostrar las listas que los usuarios verían normalmente.

Por lo tanto, en lugar de obtener la colección de listas completa, queremos obtener todas las listas que no están ocultas. Podemos hacerlo utilizando una consulta de enlace como se indica a continuación.

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();
         }
      }
   }
}

Cuando se compile y ejecute el código anterior, verá el siguiente resultado:

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

Puedes ver que esto nos devolverá todas las listas que no están ocultas.

Echemos un vistazo a otro ejemplo sencillo en el que también mostraremos información sobre los elementos de la 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();
         }
      }
   }
}

Cuando se compile y ejecute el código anterior, verá el siguiente resultado:

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

Lista de datos

Cuando crea una lista por primera vez, siempre tiene una columna de título. Esta columna de título da acceso, de forma predeterminada, al contexto de elemento de lista o al menú de bloque de control de edición.

Dado que, cada lista comienza con una columna: Título, el SPListItemtype expone eso como una propiedad. Para las columnas que no son comunes a todas las listas, puede acceder a ellas a través del indexador enSpListItem tipo.

Puede pasar un par de datos al indexador, pero el más común es el Column. Los usuarios finales en la configuración de la lista pueden cambiar este nombre. No desea utilizar este nombre porque, de nuevo, puede cambiar.

El segundo es el InternalName, que se establece en el punto en que se crea esta lista y nunca cambia. Este es el nombre que desea usar cuando accede al valor de la columna.

Echemos un vistazo a un ejemplo simple en el que recuperaremos la lista de Autores como se muestra a continuación:

En este ejemplo, obtendremos la lista de Autores y luego aumentaremos el Salario / Tasa en algún valor. Por lo tanto, para la columna Salario / Tasa usaremos elInternalName.

Step 1- Vaya al Explorador de servidores; botón derecho del ratónSharePoint Connections y seleccione Agregar conexión ... Especifique la URL y haga clic en Aceptar.

Step 2 - Expandir SharePoint Tutorials → List Libraries → Lists → Authors → Fields → Salary/Ratecampo. Botón derecho del ratónSalary/Ratey seleccione Propiedades. Verás elInternalName en la ventana Propiedades.

Step 3 - A continuación se muestra un ejemplo sencillo de cómo recuperar los autores según el salario / tarifa y aumentar su salario / tarifa.

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"]);
         }
      }
   }
}

En el código anterior, puede ver que tenemos dos métodos:

  • Uno está recuperando la lista que se llama ShowItems y

  • El otro método es aumentar las tasas que se llama RaiseRates().

Cuando se compile y ejecute el código anterior, verá el siguiente resultado:

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

En los ejemplos anteriores, siempre hemos iterado a través de los elementos usando un bucle foreach muchas veces iterando a través de todos los elementos y siempre hemos recuperado todas las columnas o al menos todas las columnas han sido accesibles.

Es realmente análogo a hacer una selección * del nombre de la tabla en una consulta SQL.

Podemos abordar este problema utilizando lo que se llama CAML queries. Al hacer una consulta CAML, tiene dos opciones:

  • Si desea consultar solo una lista, puede usar el objeto SPQuery.

  • Si desea consultar varias listas en una colección de sitios, puede usar SPSiteDataQuery.

Generalmente, cuando estás haciendo el SPSiteDataQuery, está consultando todas las listas de un tipo específico.

Por ejemplo, quiero consultar todas las listas de contactos, etc. SPSiteDataQuery le permite determinar el alcance, por lo que puede indicar que desea consultar la colección de sitios completa, un sitio individual o el sitio y todos sus elementos secundarios.

La sintaxis de las consultas CAML se describe básicamente en formato XML y se necesita un poco de tiempo para acostumbrarse a la construcción de este tipo de consultas.

Echemos un vistazo a un ejemplo sencillo de consultas CAML. Aquí, crearemos una consulta CAML para consultar los datos en nuestra 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"]);
         }
      }
   }
}

Hemos utilizado una consulta CAML para obtener algunos de los elementos. En elQueryItems método, puede ver que hemos recuperado solo aquellos elementos que no son Empleados.

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