Поле Related items field – используем в коде.

Некоторое время назад я работал с Workfow и Workflow Tasks, и увидел новый тип пол “related items”. (Простите, не знаю, как называется по-русски).

Это очень интересное поле, которое позволяет сохранят ссылки на любое количество документов или элементов списка Вашей коллекции веб узлов.

По умолчанию данное поле присутствует в списке типа Workflow Task (SharePoint 2013).

 

Если Sharepoint 2013 Workflow создает задачу для какого-то элемента, то автоматически в поле related items добавляется ссылка на исходный элемент.

 

Выглядит это примерно так.

 

 

Если нажать кнопочку “Add Related Item”, то откроется окно с выбором произвольного элемента.

 

 

 

Меня попросили решить следующую задачу. Если обновляется задача workflow, то мне нужно в исходном элементе добавить комментарий о том, кто же конкретно обновил задачу. Таким образом возникла задача прочитать и использовать поле в коде.

 

 

Если посмотреть рефлектором, то можно увидеть, что по сути это поле типа “многострочный текст” – multiline text field (Note).

 

После написания небольшой программы, которая получает собственно значение, выяснилось, что поле просто содержит строку в формате JSON!

 

 

Вот так лучше видно.

 

 

Остальное – дело техники, нужно просто добавить парсер и можно читать значения.

 

Я пытался сначала использовать парсер от ASP.NET MVC4, это прекрасно работало на моей разработческой машине с Visual Studio, но было не очень понятно, какие DLL надо установить на сервер. А в случае проблем с dynamic код просто молча падает и даже не выдает exception. Так что я просто использовал NewtonSoft JSON , который очень просто ставится через NuGet пакет .

 

Таким образом, получившийся код для чтения элементов таков :

 

using (ClientContext ctx = GetAuthenticatedContext())

{

TraceHelper.TraceInformation(ConsoleColor.Magenta, “reading related items”);

 

ctx.Load(ctx.Web, x=>x.ServerRelativeUrl);

ctx.ExecuteQuery();

 

var workflowTasksListUrl = UrlUtility.CombineUrl(ctx.Web.ServerRelativeUrl, Lists.WorkflowTasks.GetListUrl());

var workflowTasksLIst = ctx.Web.GetList(workflowTasksListUrl);

 

// this is just for demo, this is not the best code to work with sharpeoint items

var items = workflowTasksLIst.GetItems(

new CamlQuery()

);

 

ctx.Load(items);

 

ctx.ExecuteQuery();

 

string relatedItemsString = (string)items[0][BuiltInInternalFieldNames.RelatedItems];

 

dynamic decodedRelatedItems = JsonConvert.DeserializeObject(relatedItemsString);

foreach (var item in decodedRelatedItems)

{

int itemId = int.Parse(item.ItemId.ToString());

var listId = new Guid(string.Format(“{{{0}}}”, item.ListId.ToString()));

var webId = new Guid(string.Format(“{{{0}}}”, item.WebId.ToString()));

 

Console.WriteLine(“Found an item from web {0}, list {1}, itemid:{2}”,webId,listId,itemId);

 

}

 

Я приложил демонстрационное приложение “DemoAp.Reader”.

 

Перед тем как его запускать, запустите DemoApp.AssetBuilder. Это приложение использует библиотеку spmeta2 для создания необходимой структуры . Приложение расчитано на Office 365.

 

 

Исходный код

https://github.com/maratbakirov/2015_03_related_fieldsDemo