Учебники

SharePoint — серверная объектная модель

В этой главе мы рассмотрим объектную модель 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-адрес и нажмите кнопку ОК.

SharePoint Connections

Шаг 2 — Разверните Учебники по SharePoint → Библиотеки списков → Списки → Авторы → Поля → Зарплата / Поле ставки . Щелкните правой кнопкой мыши Salary / Rate и выберите Properties. Вы увидите InternalName в окне свойств.

Учебные пособия по SharePoint

Шаг 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.