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'}]" });

Для нескольких значений он может быть разделен запятой. Не пробовал это с группой, но я думаю, что это должно работать.

Надеюсь, это может быть полезно для кого-то.

Другие вопросы по тегам