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