В этой главе мы рассмотрим объектную модель SharePoint Server. Вы используете объектную модель SharePoint Server, когда пишете код, который будет выполняться в контексте SharePoint. Некоторыми распространенными примерами могут быть выделение кода на странице или в веб-части, обработчики событий для функции или списка, задания таймера и т. Д.
Особенности серверной объектной модели
Ниже приведены ключевые особенности серверной объектной модели.
-
Вы можете использовать объектную модель сервера, если вы программируете приложение ASP.NET в том же пуле приложений, который используется SharePoint.
-
Объектная модель сервера может использоваться, если вы разрабатываете клиентское приложение, такое как формы консоли или Windows, или приложение WPF, которое будет работать на сервере SharePoint.
-
Вы не можете использовать объектную модель сервера для удаленного подключения к серверу SharePoint.
-
Если вы хотите использовать объектную модель сервера, вы обращаетесь к сборке Microsoft.SharePoint . Существуют и другие сборки, которые составляют объектную модель сервера, но основной является Microsoft.SharePoint.
-
Основные типы, которые вы будете использовать чаще всего, отображаются на компоненты, которые вы используете в качестве конечного пользователя, поэтому такие вещи, как семейства сайтов, сайты, список, библиотеки и элементы списка, представлены типами SPSite, SPWeb, SPList, SPDocumentLibrary и SPListItem.
-
Типом и объектной моделью сервера, представляющей семейство сайтов, является SPSite, а типом, представляющим сайт SharePoint в объектной модели сервера, является SPWeb. Поэтому, когда вы переходите от условий конечного пользователя к условиям разработчика, вам просто нужно сделать это мысленное отображение.
Вы можете использовать объектную модель сервера, если вы программируете приложение ASP.NET в том же пуле приложений, который используется SharePoint.
Объектная модель сервера может использоваться, если вы разрабатываете клиентское приложение, такое как формы консоли или Windows, или приложение WPF, которое будет работать на сервере SharePoint.
Вы не можете использовать объектную модель сервера для удаленного подключения к серверу SharePoint.
Если вы хотите использовать объектную модель сервера, вы обращаетесь к сборке Microsoft.SharePoint . Существуют и другие сборки, которые составляют объектную модель сервера, но основной является Microsoft.SharePoint.
Основные типы, которые вы будете использовать чаще всего, отображаются на компоненты, которые вы используете в качестве конечного пользователя, поэтому такие вещи, как семейства сайтов, сайты, список, библиотеки и элементы списка, представлены типами SPSite, SPWeb, SPList, SPDocumentLibrary и SPListItem.
Типом и объектной моделью сервера, представляющей семейство сайтов, является SPSite, а типом, представляющим сайт SharePoint в объектной модели сервера, является SPWeb. Поэтому, когда вы переходите от условий конечного пользователя к условиям разработчика, вам просто нужно сделать это мысленное отображение.
Теперь, когда вы впервые начинаете использовать SharePoint, это может сбивать с толку, потому что сайт перегружен, и это означает противоположные вещи в словарях конечного пользователя и разработчика, не говоря уже о веб-словаре.
Давайте посмотрим на простой пример серверной объектной модели.
Шаг 1 — Откройте Visual Studio и создайте новый проект из меню Файл → Создать → Проект .
Шаг 2 — Выберите Windows из Шаблонов → Visual C # на левой панели и выберите Консольное приложение на средней панели. Введите название вашего проекта и нажмите ОК.
Шаг 3. После создания проекта щелкните правой кнопкой мыши проект в обозревателе решений и выберите « Добавить» → «Ссылки» .
Шаг 4 — Выберите Сборки → Расширения на левой панели, проверьте Microsoft.SharePoint на средней панели и нажмите кнопку ОК.
Теперь снова щелкните правой кнопкой мыши проект в обозревателе решений и выберите «Свойства».
Шаг 5 — Щелкните вкладку Build на левой панели и снимите флажок Prefer 32-bit .
Шаг 6 — Теперь вернитесь к файлу Program.cs и замените его следующим кодом.
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(); } } } }
Примечание. В приведенном выше коде сначала создается новый объект SPSite. Это одноразовый объект, поэтому он создается в операторе using. Конструктор SPSite принимает URL-адрес семейства сайтов, который в вашем случае будет другим.
Var web = site.RootWeb получит корень семейства сайтов.
Мы можем получить списки, используя web.Lists и напечатать заголовок пунктов списка.
Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод:
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
Вы можете видеть, что этими заголовками являются Галерея решений, Библиотека стилей, Шаблоны форм. Это списки, которые используются внутри SharePoint. Следовательно, вместо отображения всех списков, возможно, вы захотите показывать только те списки, которые пользователи обычно видят.
Следовательно, вместо получения всей коллекции списков, мы хотим получить все списки, которые не скрыты. Мы можем сделать это, используя запрос ссылки, как указано ниже.
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(); } } } }
Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод:
SharePoint Tutorials Authors Contacts Course Documents Courses Documents Site Assets Site Pages Style Library
Вы можете видеть, что это вернет нам все списки, которые не скрыты.
Давайте посмотрим на другой простой пример, в котором мы также отобразим некоторую информацию об элементах списка.
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(); } } } }
Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод:
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
Список данных
Когда вы впервые создаете список, у него всегда есть заголовок столбца. Этот столбец Заголовок по умолчанию предоставляет доступ к контексту элемента списка или меню блока управления редактированием.
Поскольку каждый список начинается с заголовка столбца, тип SPListItem представляет его как свойство. Для столбцов, которые не являются общими для каждого отдельного списка, вы можете получить к ним доступ через индексатор типа SpListItem .
Вы можете передать пару частей информации в индексатор, но наиболее распространенным является столбец . Конечные пользователи в настройках списка могут изменить это имя. Вы не хотите использовать это имя, потому что оно может измениться.
Второе — InternalName , которое задается в момент создания этого списка и никогда не изменяется. Это имя, которое вы хотите использовать при доступе к значению столбца.
Давайте посмотрим на простой пример, в котором мы получим список авторов, как показано ниже —
В этом примере мы получим список авторов, а затем увеличим зарплату / ставку на некоторое значение. Поэтому для столбца Заработная плата / ставка мы будем использовать InternalName .
Шаг 1 — Зайдите в Обозреватель серверов; щелкните правой кнопкой мыши Подключения SharePoint и выберите Добавить подключение … Укажите URL-адрес и нажмите кнопку ОК.
Шаг 2 — Разверните Учебники по SharePoint → Библиотеки списков → Списки → Авторы → Поля → Зарплата / Поле ставки . Щелкните правой кнопкой мыши Salary / Rate и выберите Properties. Вы увидите InternalName в окне свойств.
Шаг 3 — Ниже приведен простой пример получения авторов на основе зарплаты / ставки и повышения их зарплаты / ставки.
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"]); } } } }
В приведенном выше коде вы можете видеть, что у нас есть два метода —
-
Одним из них является получение списка, который называется ShowItems и
-
Другой метод — повышение Rates, которое называется RaiseRates () .
Одним из них является получение списка, который называется ShowItems и
Другой метод — повышение Rates, которое называется RaiseRates () .
Когда приведенный выше код скомпилирован и выполнен, вы увидите следующий вывод:
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
CAML Queries
В приведенных выше примерах мы всегда перебирали элементы, используя цикл foreach, много раз перебирая все элементы, и мы всегда возвращали все столбцы или, по крайней мере, все столбцы были доступны.
Это действительно аналог выполнения выбора * из имени таблицы в запросе SQL.
Мы можем решить эту проблему, используя так называемые запросы CAML . При выполнении запроса CAML у вас есть два варианта:
-
Если вы хотите запросить только один список, вы можете использовать объект SPQuery.
-
Если вы хотите запросить несколько списков в семействе сайтов, вы можете использовать SPSiteDataQuery.
Если вы хотите запросить только один список, вы можете использовать объект SPQuery.
Если вы хотите запросить несколько списков в семействе сайтов, вы можете использовать SPSiteDataQuery.
Обычно, когда вы выполняете SPSiteDataQuery , вы запрашиваете все списки определенного типа.
Например, я хочу запросить все списки контактов и т. Д. SPSiteDataQuery позволяет вам определить область действия, чтобы вы могли указать, что вы хотите запросить все семейство сайтов, отдельный сайт или сайт и все его дочерние элементы.
Синтаксис CAML-запросов в основном описан в формате XML, и для построения таких запросов требуется немного времени.
Давайте посмотрим на простой пример CAML Queries. Здесь мы создадим CAML-запрос для запроса данных в нашем списке авторов.
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"]); } } } }
Мы использовали запрос CAML, чтобы получить некоторые элементы. В методе QueryItems вы можете видеть, что мы получили только те элементы, которые не являются Employee.