четверг, 5 декабря 2013 г.

SharePoint 2013 Workflow: ошибка в CreateListItem: System.FormatException: Hexadecimal 0x expected in '{0}'.

Продолжаю тему рабочих процессов в SharePoint 2013. Столкнулся со странным: казалось бы, совершенно невинное activity CreateListItem выдает странное исключение: System.FormatException: Hexadecimal 0x expected in '{0}'. Покопавшись в блогах и форумах, быстро нашёл причину: ошибка происходит при выборе имени списка из выпадающего списка в свойстве ListId:

Visual Studio подставляет в свойство автоматически выражение типа: System.Guid.Parse("{$ListId:Lists/List1;}"). А среда, видимо, выражение "{$ListId:Lists/List1;}" вычисляет некорректно. В результате, ошибка при разборе Guid.

В интернетах советуют просто захардкодить в свойство ListId идентификатор (guid) списка. Но такое решение мне не показалось хорошим. Нужно было придумать, как получить идентификатор списка в процессе выполнения. Странно, но среди стандартных activity нужное действие по получению свойств произвольного списка отсутствует.

На выручку пришло событие HttpSend и REST (про REST смотри, например, тут: Working with lists and list items with REST). С помощью HttpSend посылаем запрос вида: webUrl + "/_api/web/lists/GetByTitle('" + ListTitle + "')", в ответ получаем все основные свойства списка. Для удобства результат лучше получать в виде JSON. Для этого посылаем специальный HTTP-заголовок: Accept=application/json;odata=verbose

Для удобства все эти действия оформил в виде custom activity. Результат получился примерно такой:

В результате, сначала получаем ИД списка с помощью нашей activity, сохраняем в переменной и указываем её в параметре ListId:


1 комментарий: