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