Использование списков SharePoint в качестве объектов LightSwitch с помощью CSOM

Списки как объекты

Брайан уже рассказал о присоединении к списку SharePoint и моделировании его объектов в приложении LightSwitch с поддержкой SharePoint. Однако это еще не все — вы можете выполнить присоединение к локальному сайту SharePoint в любом приложении LightSwitch, указав имя пользователя и пароль или же выступив в роли пользователя приложения LightSwitch. Имя пользователя и пароль нужны для ограничения доступа к списку, чтобы им могло пользоваться только ваше приложение LightSwitch.

image

Включив поддержку SharePoint в вашем приложении LightSwitch, вы тем самым указываете LightSwitch, что приложение должно быть развернуто на SharePoint и что оно может работать с ресурсами SharePoint. Поддержка включается в SharePoint на странице Properties (Свойства):

image

Если указать сайт Office 365 в качестве целевого, то можно делать присоединение к спискам на сайте Office 365, однако для этого нужно будет разрешить LightSwitch выбор идентификационной информации пользователя. В среде выполнения этим пользователем будет тот, кто запустил приложение в SharePoint. Как правило, в ходе отладки вы запускаете приложения с вашей личной или тестовой учетной записью. Поэтому если при попытке присоединения к списку в Office 365 появляется сообщение об ошибке с текстом наподобие « […] does not appear to be a valid site. SharePoint 2010 (or later) with an installation of WCF Data Services is required» («сайт […] недействителен. Требуется SharePoint 2010 или более поздняя версия с установленными службами WCF Data Services»), причины, скорее всего, будут следующие: отключена поддержка SharePoint, отключен автоматический выбор идентификационной информации или же вы пытаетесь сделать присоединение к другому сайту, который не указан в свойствах SharePoint. Если вы разворачиваете приложение на конкретном сайте Office 365, то он является единственным сайтом Office 365, к которому можно делать присоединение в LightSwitch.

Итак, каковы же преимущества использования списков SharePoint в качестве объектов? Теперь можно обращаться с данными списка точно так же, как с любым другим источником данных LightSwitch, включая использование собственного программного кода для обработки сохранения данных. Давайте возьмем пример Брайана и внесем в него кое-какие изменения после добавления списка покупателей к сайту. В компанию может позвонить клиент, с которым уже общался один из наших агентов по продажам. Нам нужна возможность перенаправления вызова к тому же самому агенту, поскольку он в курсе текущей ситуации с клиентом и ему будет проще выстроить разговор. Давайте слегка изменим этот список. Щелкните заголовок приложения Customers (Клиенты), затем нажмите Edit this list (Правка списка):

image

Нажмите на символ плюса, чтобы добавить столбец, затем выберите Date or Time (Дата или время):

image

Назовите этот столбец Last Contact Date (Дата последнего контакта). Затем добавьте еще один столбец, в этот раз он будет иметь тип String (Строка) и имя Last Contact Person (Последнее контактное лицо). Ваш список должен выглядеть так:

image

Затем выберите Stop editing this list (Прекратить правку списка). Вернитесь в LightSwitch, и если сайт SharePoint уже добавлен вами в качестве источника данных, щелкните его правой кнопкой мыши и выберите Update Datasource (Обновить источник данных).

image

Затем просто нажмите Finish (Готово). После этого вы можете открыть объект Customer (Клиент) и увидите новые поля.

image

 

Пока мы находимся в этом окне, самое время присвоить общему свойству Customer значение FirstName (Имя), если вы еще не сделали этого. В результате LightSwitch будет отображать имя клиента в общем представлении, которое используется по умолчанию при открытии нового окна. Чтобы изменить представление, сначала нажмите кнопку «Клиент».

image

Раз уж мы отслеживаем звонки наших клиентов, давайте составим таблицу для этого. Моя выглядит примерно так.

image

Вот, я создал новую таблицу с именем CustomerCall, а затем добавил отношение, которое связало ее со списком Customer (Клиент).

image

Затем я добавил несколько дополнительных полей. Type (Тип) — это список выбора с параметрами Refund (Возмещение), Purchase (Покупка), Quote (Предложение с расценками) и Other (Другое).

image

Я также добавил поле ContactPerson для хранения сведений о сотруднике, который общался с клиентом, и поле Notes (Примечания) для хранения общих сведений. Придумаем простой интерфейс для этого окна, оставив окно Browse (Просмотр) для отображения данных CustomerCalls и добавив кнопку AddAndEditNew для перехода к диалоговому окну AddEditCustomerCall.

image

image

Ничего нового для вас здесь нет, но давайте снова откроем объект CustomerCall и напишем пару строк кода. Нажмите кнопку с раскрывающимся списком Write Code (Написать код) в верхней части средства Data Designer и выберите метод Inserting (Вставка).

image

Затем можно добавить следующий код:

(C#)

partial void CustomerCalls_Inserting(CustomerCall entity) 

  entity.Customer.LastContactDate = DateTime.Now; 
  entity.Customer.LastContactPerson = entity.ContactPerson; 
  ServerApplicationContext.Current.DataWorkspace.SharePoint_SiteData.SaveChanges(); 
}

(Visual Basic)

Private Sub CustomerCalls_Inserting(entity As CustomerCall)
 entity.Customer.LastContactDate = DateTime.Now
 entity.Customer.LastContactPerson = entity.ContactPerson
 ServerApplicationContext.Current.DataWorkspace.SharePoint_SiteData.SaveChanges()
End Sub

Обратите внимание, что выделенную часть необходимо изменить так, чтобы она совпадала с именами ваших источников данных.

Теперь можно нажать F5 для сборки проекта и ввести сведения о первом звонке клиента.

image

Затем, если вернуться обратно к списку Customer (Клиент), можно увидеть примерно следующее.

image

Пример весьма прост, однако приятно видеть, что со списками SharePoint можно работать почти так же как с любыми другими типами объектов LightSwitch. Чуть позже мы продолжим работу с этими списками.

Действие над списками при помощи CSOM

Предположим, вы всегда выбираете сложный путь. Если вам необходимо управление всеми аспектами взаимодействия LightSwitch с SharePoint, можно использовать SharePoint Client-Side Object Model (CSOM, модель объекта SharePoint на стороне клиента). Один из возможных сценариев ее использования — разработка приложения LightSwitch с поддержкой SharePoint. В этом случае вы сможете добавлять списки SharePoint к вашим проектам, однако LightSwitch не сможет подключиться к ним, поскольку эти списки не существуют до момента установки приложения на сайте SharePoint.

Возвращаясь к доработке приложения Брайана, мы видим, что у этого приложения уже есть окна Browse (Просмотр) и Edit Customer (Правка сведений о клиенте). Сведения о клиенте конфиденциальны, поэтому мы не будем проводить аудит вносимых в них изменений. Давайте добавим список в наш проект SharePoint для сбора этих сведений.

Возможно, предлагаемый способ окажется для вас неудобным. Списки, которые вы добавляете в проект SharePoint, принадлежат веб-приложению. Это значит, что они создаются в момент установки приложения LightSwitch и удаляются при удалении приложения, что приводит к потере всех данных. Для списка Customers (Клиенты) действует другой механизм работы, поскольку этот список относится к веб-узлу и не связан с конкретным приложением. В сети MSDN есть дополнительные сведения о веб-узлах, веб-приложениях и компонентах SharePoint в SharePoint 2013.

Однако это лишь пример, нас сейчас не волнует вечное хранение этих данных. Перейдите к представлению файла в обозревателе проектов, щелкните правой кнопкой мыши ваш проект SharePoint и выберите Add –> New Item (Добавить –> Новый элемент).

image

Здесь по умолчанию необходимо выбрать List (Список); назовите его AuditEntry и нажмите Add (Добавить). В следующем окне LightSwitch попросит выбрать тип списка. Журнал аудита не входит в типы по умолчанию, поэтому оставьте значение Default (Custom List) (По умолчанию (Настраиваемый список)), и мы настроим его самостоятельно.

image

Теперь нужно разработать столбцы списка. В него следует добавить числовое поле для параметра Customer ID (Идентификатор клиента), который указывает на изменяемые нами сведения о клиенте, текстовое поле с именем пользователя, вносящего изменения, поле с датой внесения изменений и текстовое поле с описанием выполненного действия.

image

Если вы попытаетесь обновить источник данных SharePoint прямо сейчас, то не увидите этого списка. Причина состоит в том, что это список не существует на сайте до тех пор, пока проект не будет собран нажатием клавиши F5 или не будет развернут из опубликованного пакета приложения SharePoint. Однако работать с CSOM можно и без этого! Откройте объект Customer (Клиент) и напишите код для метода обновления.

image

Заполните ваш класс SharePoint_SiteDataService (имя может быть любым) следующим образом:

(C#)

using Microsoft.SharePoint.Client;

public partial class SharePoint_SiteDataService 

  partial void Customers_Updating(Customer entity) 
  { 
    LogAuditEntry(entity, "Обновить"); 
  }

  partial void Customers_Deleting(Customer entity) 
  { 
    LogAuditEntry(entity, "Удалить"); 
  }

  private void LogAuditEntry(Customer entity, string actionDescription) 
  { 
    using (ClientContext ctx = Application.SharePoint.GetAppWebClientContext()) 
    { 
      Web web = ctx.Web; 
      ListCollection lists = web.Lists; 
      List auditLog = lists.GetByTitle("Запись аудита"); 
      ListItemCreationInformation ci = new ListItemCreationInformation(); 
      ListItem auditEntry = auditLog.AddItem(ci); 
      auditEntry["Название"] = "Запись аудита"; 
      auditEntry["ИД клиента 1"] = entity.Id; 
      auditEntry["Пользователь1"] = Application.User.FullName; 
      auditEntry["Дата1"] = DateTime.Now; 
      auditEntry["Действие"] = actionDescription; 
      auditEntry.Update(); 
      ctx.ExecuteQuery(); 
    } 
  } 
}

(Visual Basic)

Imports Microsoft.SharePoint.Client

Public Class SharePoint_SiteDataService
 Private Sub Customers_Updating(entity As Customer)
 LogAuditEntry(entity, "Обновить")
 End Sub

 Private Sub Customers_Deleting(entity As Customer)
 LogAuditEntry(entity, "Удалить")
 End Sub

 Private Sub LogAuditEntry(entity As Customer, actionDescription As String)
 Using ctx As ClientContext = Application.SharePoint.GetAppWebClientContext()
 Dim web As Web = ctx.Web
 Dim lists As ListCollection = Web.Lists
 Dim auditLog As List = lists.GetByTitle("Запись аудита")
 Dim ci As New ListItemCreationInformation()
 Dim auditEntry As ListItem = auditLog.AddItem(ci)
 

 auditEntry("Название") = "Запись аудита"
 auditEntry("ИД клиента1") = entity.Id
 auditEntry("Пользователь1") = Application.User.FullName
 auditEntry("Дата 1") = DateTime.Now
 auditEntry("Действие") = actionDescription
 
 auditEntry.Update()
 ctx.ExecuteQuery()
 End Using
 End Sub
End Class

Теперь снова соберите проект нажатием клавиши F5 и внесите изменения в сведения о клиенте, которые будут записаны в список, добавленный к проекту. Когда вы нажали F5, LightSwitch развернул ваш проект на SharePoint, а также создал элементы, добавленные вами в проект SharePoint. Итак, где же находится этот список? Возьмите URL-адрес вашего сайта SharePoint, включая имя коллекции сайтов разработчика (при наличии), затем добавьте к нему имя вашего приложения и строку “/Lists/AuditEntry”. Вот моя строка: https://example.sharepoint.com/sites/Developer/ListAttachDemo/Lists/AuditEntry. Результат будет выглядеть так.

image

Теперь мы можем использовать списки, которые не привязаны к LightSwitch. Вы также могли заметить, что мною нарушено единообразие имен столбцов для записи со списком (User1 и просто Action). На этом стоит остановиться подробнее, ведь даже я не сразу понял причину этого явления. SharePoint иногда отображает не совсем верное имя столбца в конструкторе списков и на веб-сайте. Если в качестве имени столбца указать строку, которую SharePoint сочтет именем типа или иным зарезервированным словом, то для снятия неоднозначности к этой строке будет добавлено число. Как же узнать настоящее имя столбца? Я использую следующий код:

(C#)

using (ClientContext ctx = Application.SharePoint.GetAppWebClientContext()) 

  Web web = ctx.Web; 
  ListCollection lists = web.Lists; 
  List auditLog = lists.GetByTitle("AuditEntry"); 
  ctx.Load(auditLog.Fields); 
  ctx.ExecuteQuery(); 
}

(Visual Basic)

Using ctx As ClientContext = Application.SharePoint.GetAppWebClientContext()
 Dim web As Web = ctx.Web
 Dim lists As ListCollection = Web.Lists
 Dim auditLog As List = lists.GetByTitle("AuditEntry")

 ctx.Load(auditLog.Fields)
 ctx.ExecuteQuery()
End Using

После этого кода можно поставить точку останова и посмотреть содержимое поля auditLog.Fields, чтобы увидеть настоящие имена столбцов SharePoint. Это первый прием, которым я воспользуюсь в случае возникновения ошибки наподобие Column <ColumnName> does not exist. Itmayhavebeendeletedbyanotheruser (Столбец <ColumnName> не существует. Он мог быть удален другим пользователем).

С помощью CSOM можно делать множество интересных вещей, некоторые из них приведены на справочной странице MSDN. Например, при помощи CSOM можно добавлять и изменять списки, решать задачи администрирования сайта, передавать документы на сайт, управлять группами и пользователями. Если вас интересует какая-то отдельная тема, напишите мне, и я подумаю над тем, чтобы черкнуть о ней пару строк.