SharePoint - Modello a oggetti del server
In questo capitolo daremo uno sguardo al modello a oggetti di SharePoint Server. Si utilizza il modello a oggetti di SharePoint Server quando si scrive codice che verrà eseguito nel contesto di SharePoint. Alcuni esempi comuni potrebbero essere il code-behind in una pagina o una web part, gestori di eventi dietro una funzionalità o un elenco, processi timer ecc.
Caratteristiche del modello a oggetti del server
Di seguito sono riportate le caratteristiche principali di Server Object Model
È possibile utilizzare il modello a oggetti server se si programma un'applicazione ASP.NET all'interno dello stesso pool di applicazioni utilizzato da SharePoint.
Il modello a oggetti server può essere utilizzato se si sviluppa un'applicazione client come console o Windows Form o un'app WPF che verrà eseguita su un server SharePoint.
Non è possibile utilizzare il modello di oggetti server per connettersi in remoto a un server SharePoint.
Quando si desidera utilizzare il modello di oggetti server, fare riferimento a Microsoft.SharePointassemblaggio. Ci sono altri assembly, che costituiscono il Server Object Model, ma Microsoft.SharePoint è quello principale.
I tipi principali che utilizzerai più comunemente mappano ai componenti che utilizzi come utente finale, quindi cose come raccolte siti, siti, elenchi, raccolte ed elementi di elenchi sono rappresentati dai tipi SPSite, SPWeb, SPList, SPDocumentLibrary e SPListItem.
Il tipo e il modello a oggetti server che rappresenta una raccolta siti è SPSite e il tipo che rappresenta un sito di SharePoint nel modello a oggetti server è SPWeb. Pertanto, quando passi dai termini per l'utente finale ai termini per sviluppatori, dovrai solo eseguire quella mappatura mentale.
Ora, quando inizi a utilizzare SharePoint per la prima volta, può creare confusione perché il sito è sovraccarico e significa cose opposte nei vocabolari dell'utente finale e degli sviluppatori, per non parlare del vocabolario web.
Diamo uno sguardo a un semplice esempio di Server Object Model.
Step 1 - Apri Visual Studio e crea un nuovo progetto da File → New → Project opzione di menu.
Step 2 - Seleziona Windows da Templates → Visual C#nel riquadro di sinistra e scegli Applicazione console nel riquadro centrale. Immettere il nome del progetto e fare clic su OK.
Step 3 - Una volta creato il progetto, fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e selezionare Add → References.
Step 4 - Seleziona Assemblies → Extensions nel riquadro di sinistra e controlla Microsoft.SharePoint nel riquadro centrale e fai clic sul pulsante Ok.
Ora fai nuovamente clic con il pulsante destro del mouse sul progetto in Esplora soluzioni e seleziona Proprietà.
Step 5 - Fare clic su Build Tab nel riquadro sinistro e deseleziona il Prefer 32-bit opzione.
Step 6 - Ora torna al Program.cs file e sostituirlo con il codice seguente.
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- Nel codice precedente è stato prima creato un nuovo oggetto SPSite. Questo è un oggetto usa e getta, quindi viene creato all'interno di un'istruzione using. Il costruttore di SPSite accetta l'URL della raccolta siti, che sarà diverso nel tuo caso.
La var web = site.RootWeb otterrà la radice della raccolta siti.
Possiamo ottenere gli elenchi utilizzando web.Lists e stampare il titolo degli elementi dell'elenco.
Quando il codice precedente viene compilato ed eseguito, vedrai il seguente output:
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
Puoi vedere che questi titoli sono Raccolta soluzioni, Libreria di stili, Modelli di modulo. Si tratta di elenchi utilizzati internamente da SharePoint. Pertanto, invece di visualizzare tutti gli elenchi, forse vuoi mostrare solo gli elenchi che gli utenti vedrebbero normalmente.
Quindi, invece di ottenere l'intera raccolta di elenchi, vogliamo ottenere tutti gli elenchi che non sono nascosti. Possiamo farlo utilizzando una query di collegamento come indicato di seguito.
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 il codice precedente viene compilato ed eseguito, vedrai il seguente output:
SharePoint Tutorials
Authors
Contacts
Course Documents
Courses
Documents
Site Assets
Site Pages
Style Library
Puoi vedere che questo ci restituirà tutti gli elenchi che non sono nascosti.
Diamo uno sguardo ad un altro semplice esempio in cui mostreremo anche alcune informazioni sugli elementi dell'elenco.
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 il codice precedente viene compilato ed eseguito, vedrai il seguente output:
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
Dati elenco
Quando crei per la prima volta un elenco, ha sempre una colonna del titolo. Questa colonna del titolo dà accesso, per impostazione predefinita, al contesto della voce di elenco o al menu del blocco di controllo di modifica.
Poiché ogni elenco inizia con una colonna: Titolo, il file SPListItemtype lo espone come proprietà. Per le colonne che non sono comuni ad ogni singola lista, è possibile accedervi tramite l'indicizzatore suSpListItem genere.
Puoi passare un paio di informazioni all'indicizzatore, ma la più comune è il file Column. Gli utenti finali nelle impostazioni dell'elenco possono modificare questo nome. Non vuoi usare questo nome perché ancora una volta può cambiare.
Il secondo è il file InternalName, che è impostato nel punto in cui viene creato questo elenco e non cambia mai. Questo è il nome che desideri utilizzare quando accedi al valore della colonna.
Diamo uno sguardo al semplice esempio in cui recupereremo l'elenco degli autori come mostrato di seguito -
In questo esempio, otterremo l'elenco degli autori e quindi aumenteremo lo stipendio / tasso di un certo valore. Pertanto, per la colonna Stipendio / Tasso utilizzeremo ilInternalName.
Step 1- Vai a Esplora server; fare clic con il tasto destroSharePoint Connections e selezionare Aggiungi connessione ... Specificare l'URL e fare clic su OK.
Step 2 - Espandi SharePoint Tutorials → List Libraries → Lists → Authors → Fields → Salary/Ratecampo. Fare clic con il tasto destroSalary/Ratee seleziona Proprietà. Vedrai il fileInternalName nella finestra Proprietà.
Step 3 - Di seguito è riportato un semplice esempio di recupero degli autori in base a stipendio / tasso e aumentare il loro stipendio / tasso.
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"]);
}
}
}
}
Nel codice sopra puoi vedere che abbiamo due metodi:
Uno sta recuperando l'elenco che è stato chiamato ShowItems e
L'altro metodo è aumentare le tariffe che viene chiamato RaiseRates().
Quando il codice precedente viene compilato ed eseguito, vedrai il seguente output:
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
Query CAML
Negli esempi precedenti, abbiamo sempre iterato attraverso gli elementi utilizzando un ciclo foreach molte volte ripetendo tutti gli elementi e abbiamo sempre riportato tutte le colonne o almeno tutte le colonne erano accessibili.
È davvero analogo all'esecuzione di una selezione * dal nome della tabella in una query SQL.
Possiamo risolvere questo problema utilizzando quelli che vengono chiamati CAML queries. Quando esegui una query CAML hai due opzioni:
Se desideri eseguire una query su un solo elenco, puoi utilizzare l'oggetto SPQuery.
Se si desidera eseguire query su più elenchi in una raccolta siti, è possibile utilizzare SPSiteDataQuery.
In genere, quando esegui il file SPSiteDataQuery, stai interrogando tutti gli elenchi di un tipo specifico.
Ad esempio, desidero eseguire una query su tutti gli elenchi di contatti e così via. SPSiteDataQuery consente di determinare l'ambito, in modo da poter indicare che si desidera eseguire una query sull'intera raccolta siti, su un singolo sito o sul sito e tutti i suoi figli.
La sintassi per le query CAML è sostanzialmente descritta in formato XML e ci vuole un po 'di tempo per abituarsi a costruire questo tipo di query.
Diamo un'occhiata a un semplice esempio di query CAML. Qui, creeremo una query CAML per interrogare i dati nel nostro elenco di autori.
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"]);
}
}
}
}
Abbiamo utilizzato una query CAML per ottenere alcuni degli elementi. NelQueryItems , puoi vedere che abbiamo recuperato solo quegli elementi che non sono Dipendente.
Salary or rate for Mark Upston is $15.10
Salary or rate for Allan Bommer is $20.10