Поле 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.
Исходный код