SharePoint - model obiektów serwera
W tym rozdziale przyjrzymy się modelowi obiektów programu SharePoint Server. Model obiektów programu SharePoint Server jest używany podczas pisania kodu, który będzie działał w kontekście programu SharePoint. Niektóre typowe przykłady to kod źródłowy na stronie lub składniku Web Part, programy obsługi zdarzeń za funkcją lub listą, zadania czasomierza itp.
Funkcje modelu obiektowego serwera
Poniżej przedstawiono kluczowe cechy modelu obiektów serwera
Możesz użyć modelu obiektów serwera, jeśli programujesz aplikację ASP.NET w tej samej puli aplikacji, która jest używana przez SharePoint.
Model obiektów serwera może być używany, jeśli tworzysz aplikację kliencką, taką jak formularze konsoli lub Windows lub aplikację WPF, która będzie działać na serwerze SharePoint.
Nie można używać modelu obiektów serwera do zdalnego łączenia się z serwerem SharePoint.
Jeśli chcesz użyć modelu obiektów serwera, skorzystaj z Microsoft.SharePointmontaż. Istnieją inne zestawy, które składają się na model obiektów serwera, ale głównym jest Microsoft.SharePoint.
Podstawowe typy, których będziesz najczęściej używać, są odwzorowywane na komponenty, których używasz jako użytkownik końcowy, więc takie elementy, jak zbiory witryn, witryny, listy, biblioteki i elementy list, są reprezentowane przez typy SPSite, SPWeb, SPList, SPDocumentLibrary i SPListItem.
Typ i model obiektów serwera reprezentujący zbiór witryn to SPSite, a typem reprezentującym witrynę programu SharePoint w modelu obiektów serwera to SPWeb. Dlatego, przechodząc od warunków użytkownika końcowego do warunków deweloperskich, wystarczy wykonać mapowanie mentalne.
Teraz, kiedy po raz pierwszy zaczynasz korzystać z SharePoint, może to być mylące, ponieważ witryna jest tak przeciążona, co oznacza przeciwne rzeczy w słownikach użytkownika końcowego i programistów, nie wspominając o słownictwie internetowym.
Spójrzmy na prosty przykład modelu obiektów serwera.
Step 1 - Otwórz program Visual Studio i utwórz nowy projekt z File → New → Project opcja menu.
Step 2 - Wybierz Windows z Templates → Visual C#w lewym okienku i wybierz aplikację konsolową w środkowym panelu. Wpisz nazwę swojego projektu i kliknij OK.
Step 3 - Po utworzeniu projektu kliknij prawym przyciskiem myszy projekt w Eksploratorze rozwiązań i wybierz Add → References.
Step 4 - Wybierz Assemblies → Extensions w lewym okienku i zaznacz Microsoft.SharePoint w środkowym okienku i kliknij przycisk OK.
Teraz kliknij ponownie prawym przyciskiem myszy projekt w Eksploratorze rozwiązań i wybierz Właściwości.
Step 5 - Kliknij Build Karta w lewym okienku i odznacz opcję Prefer 32-bit opcja.
Step 6 - Teraz wróć do Program.cs plik i zastąp go następującym kodem.
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- W powyższym kodzie najpierw utworzono nowy obiekt SPSite. Jest to obiekt jednorazowego użytku, więc jest tworzony w instrukcji using. Konstruktor SPSite pobiera adres URL do zbioru witryn, który będzie inny w Twoim przypadku.
Zmienna web = site.RootWeb otrzyma katalog główny zbioru witryn.
Możemy pobrać listy za pomocą web.Lists i wydrukować tytuły pozycji listy.
Kiedy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe -
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
Jak widać, te tytuły to Galeria rozwiązań, Biblioteka stylów, Szablony formularzy. Są to listy używane wewnętrznie przez SharePoint. Dlatego zamiast wyświetlać wszystkie listy, być może chcesz pokazać tylko te listy, które użytkownicy normalnie widzieli.
Dlatego zamiast pobierać całą kolekcję list, chcemy uzyskać wszystkie listy, które nie są ukryte. Możemy to zrobić za pomocą zapytania o link, jak podano poniżej.
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();
}
}
}
}
Kiedy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe -
SharePoint Tutorials
Authors
Contacts
Course Documents
Courses
Documents
Site Assets
Site Pages
Style Library
Widać, że to zwróci nam wszystkie listy, które nie są ukryte.
Rzućmy okiem na inny prosty przykład, w którym wyświetlimy również informacje o elementach listy.
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();
}
}
}
}
Kiedy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe -
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
Dane listy
Kiedy tworzysz listę po raz pierwszy, zawsze ma ona kolumnę tytułową. Ta kolumna Tytuł zapewnia domyślnie dostęp do kontekstu elementu listy lub menu edycji bloku kontrolnego.
Ponieważ każda lista zaczyna się od kolumny - Tytuł, rozszerzenie SPListItemtype ujawnia to jako właściwość. W przypadku kolumn, które nie są wspólne dla każdej listy, można uzyskać do nich dostęp za pośrednictwem indeksatora w witrynieSpListItem rodzaj.
Możesz przekazać kilka informacji do indeksatora, ale najczęściej jest to plik Column. Użytkownicy końcowi w ustawieniach listy mogą zmienić tę nazwę. Nie chcesz używać tej nazwy, ponieważ znowu może się zmienić.
Drugi to InternalName, który jest ustawiony w momencie tworzenia tej listy i nigdy się nie zmienia. To jest nazwa, której chcesz użyć podczas uzyskiwania dostępu do wartości kolumny.
Spójrzmy na prosty przykład, w którym pobierzemy listę autorów, jak pokazano poniżej -
W tym przykładzie otrzymamy listę autorów, a następnie podniesiemy wynagrodzenie / stawkę o pewną wartość. Dlatego w kolumnie Wynagrodzenie / Stawka będziemy używaćInternalName.
Step 1- Przejdź do eksploratora serwera; kliknij prawym przyciskiem myszySharePoint Connections i wybierz Dodaj połączenie ... Określ adres URL i kliknij OK.
Step 2 - Rozwiń SharePoint Tutorials → List Libraries → Lists → Authors → Fields → Salary/Ratepole. Kliknij prawym przyciskiem myszySalary/Ratei wybierz Właściwości. Zobaczysz plikInternalName w oknie Właściwości.
Step 3 - Poniżej podano prosty przykład pobierania autorów na podstawie wynagrodzenia / stawki i podnoszenia ich wynagrodzenia / stawki.
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"]);
}
}
}
}
W powyższym kodzie widać, że mamy dwie metody -
Jednym z nich jest pobranie listy, która się nazywa ShowItems i
Inną metodą jest podniesienie stawek, które nazywa się RaiseRates().
Kiedy powyższy kod zostanie skompilowany i wykonany, zobaczysz następujące dane wyjściowe -
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
Zapytania CAML
W powyższych przykładach zawsze przechodziliśmy przez elementy za pomocą pętli foreach, wielokrotnie przechodząc przez wszystkie elementy i zawsze przywracaliśmy wszystkie kolumny lub przynajmniej wszystkie kolumny były dostępne.
Jest to odpowiednik wykonywania polecenia select * z nazwy tabeli w zapytaniu SQL.
Możemy rozwiązać ten problem, używając tak zwanych CAML queries. Podczas wykonywania zapytania CAML masz dwie opcje -
Jeśli chcesz zapytać tylko o jedną listę, możesz użyć obiektu SPQuery.
Jeśli chcesz przeszukiwać wiele list w zbiorze witryn, możesz użyć zapytania SPSiteDataQuery.
Ogólnie rzecz biorąc, kiedy robisz SPSiteDataQuery, odpytujesz wszystkie listy określonego typu.
Na przykład chcę odpytać wszystkie listy kontaktów itp. SPSiteDataQuery umożliwia określenie zakresu, dzięki czemu można wskazać, że chcesz wykonać zapytanie dotyczące całego zbioru witryn, pojedynczej witryny lub witryny i wszystkich jej elementów podrzędnych.
Składnia zapytań CAML jest zasadniczo opisana w formacie XML i przyzwyczajenie się do konstruowania tego rodzaju zapytań zajmuje trochę czasu.
Spójrzmy na prosty przykład zapytań CAML. W tym miejscu utworzymy zapytanie CAML w celu zbadania danych z naszej listy autorów.
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"]);
}
}
}
}
Użyliśmy zapytania CAML, aby uzyskać niektóre elementy. wQueryItems możesz zobaczyć, że pobraliśmy tylko te elementy, które nie są pracownikami.
Salary or rate for Mark Upston is $15.10
Salary or rate for Allan Bommer is $20.10