SharePoint CSOM: как обновить поле человека или группы с помощью ValidateUpdateListItem?
Я обновляю элемент списка SharePoint, используя метод ValidateUpdateListItem объектной модели на стороне клиента, чтобы предотвратить создание новой версии элемента. Это в основном работает хорошо для всех полей, кроме полей с типом поля человек или группа. Кто-нибудь знает, каково правильное строковое представление значения пользователя или группы, которое будет использоваться в качестве FieldValue объекта ListItemFormUpdateValue? Я уже перепробовал все, что мне кажется разумным (идентификатор пользователя из "Информация о пользователе", имя для входа в систему, значение поиска, например комбинации этих данных и т. Д.), Но безуспешно.
2 ответа
К сожалению, метод ListItem.ValidateUpdateListItem не поддерживает обновление значения пользовательского поля. Например, в следующем примере AssignedTo
поле не будет обновлено:
using (var ctx = GetContext(webUri, userName, password))
{
var list = ctx.Web.Lists.GetByTitle(listTitle);
var item = list.GetItemById(itemId);
var formValues = new List<ListItemFormUpdateValue>();
formValues.Add(new ListItemFormUpdateValue() { FieldName = "Title", FieldValue = taskName});
formValues.Add(new ListItemFormUpdateValue() { FieldName = "AssignedTo", FieldValue = userId.ToString() }); //not supported
item.ValidateUpdateListItem(formValues, true, string.Empty);
ctx.ExecuteQuery();
}
Вместо этого рассмотрите метод ListItem.Update, чтобы обновить значение поля пользователя, как показано ниже:
using (var ctx = GetContext(webUri, userName, password))
{
var list = ctx.Web.Lists.GetByTitle(listTitle);
var item = list.GetItemById(itemId);
item["Title"] = taskName;
var assignedToValue = new FieldUserValue() { LookupId = userId };
var assignedToValues = new[] { assignedToValue };
item["AssignedTo"] = assignedToValues; //multi-valued user field
item.Update();
ctx.ExecuteQuery();
}
Я только что столкнулся с проблемой, когда обновление более 12 человек или групповых полей с обновлением элемента вызвало исключение. По-видимому, это вызвано порогом просмотра списка в SP онлайн (12 на эту дату).
http://blog.vanmeeuwen-online.nl/2012/07/value-does-not-fall-within-expected.html
Чтобы обойти это, я использовал метод ValidateUpdateListItem для обновления идентификаторов человека или группы. Хитрость заключается в том, чтобы назначить JSON в формате
[{"Key":"я:0#.f| членство |user@yoursite.onmicrosoft.com"}]
formValues.Add(new ListItemFormUpdateValue() { FieldName = "AssignedTo", FieldValue = "[{'Key':'i:0#.f|membership|user@yoursite.onmicrosoft.com'}]" });
Для нескольких значений он может быть разделен запятой. Не пробовал это с группой, но я думаю, что это должно работать.
Надеюсь, это может быть полезно для кого-то.