Как лучше всего преобразовать строку многопользовательского поля SharePoint в массив SPUsers? - PullRequest
9 голосов
/ 01 января 2009

Я пишу обработчик ItemAdding для списка SharePoint, и этот список содержит многопользовательские поля. Поскольку SPItem на данный момент недоступен, я думаю, что я вынужден использовать строку, возвращаемую из SPItemEventDataCollection. Эта строка будет выглядеть примерно так, когда присутствуют user1, user2 и user3:

1; #MYDOMAIN \ user1; # 4; #MYDOMAIN \ user2; # 10; #MYDOMAIN \ user3

Я хотел бы преобразовать это в массив объектов SPUser, чтобы передать его в другой существующий метод. Существует ли какой-либо встроенный в SharePoint способ обработки этих строк, или я вынужден анализировать эту строку?

Кроме того, предполагая, что мне нужно разобраться с этой строкой, похоже, что целочисленные токены здесь всегда соответствуют домену \ username, который следует. Есть ли случаи, когда это не будет правдой, а либо целое число, либо домен \ имя пользователя отсутствуют, либо иным образом неверны? Было бы безопасно просто использовать числа и использовать метод SiteUsers.GetByID (id) SPWeb? В нескольких тестах я не могу заставить это потерпеть неудачу, но кажется странным, что числовые и строковые данные будут включены, если они полностью избыточны.

Спасибо!

Ответы [ 2 ]

16 голосов
/ 19 января 2009

SPFieldUserValueCollection делает именно то, что вы ищете. Его конструктор принимает SPWeb и строку пользователей. Элементы SPFieldUserValue в коллекции предоставляют свойство User, которое возвращает соответствующие объекты SPUser для Интернета.

private void ProcessUsers(SPListItem item, string fieldName)
{
  string fieldValue = item[fieldName] as string;
  SPFieldUserValueCollection users = new SPFieldUserValueCollection(item.Web, fieldValue);

  foreach(SPFieldUserValue uv in users)
  {
    SPUser user = uv.User;
    // Process user
  }
}

Тип SPFieldUser наследует свое поведение от стандартного SPFieldLookup, который также хранит как ID, так и Title и имеет соответствующий SPFieldLookupValueCollection. Идентификатор поддерживает (слабую) ссылочную целостность, а кэшированное значение - для быстрых запросов.

0 голосов
/ 01 января 2009

Это работает для меня, получая SPSuser из пользовательского поля. Это должно быть то же самое для извлечения его из данных событий .:

private SPUser getGroup(SPListItem item, string fieldName)
        {
            string fieldValue = item[fieldName] as string;
            if (string.IsNullOrEmpty(fieldValue)) return null;
            int id = int.Parse(fieldValue.Split(';')[0]);
            SPUser user = item.Web.AllUsers.GetByID(id);
            return user;
        }

Целое число относится к идентификатору пользователя в локальной базе данных пользователей SPWebs. Однако это не синхронизируется, поэтому пользователь мог быть удален из базы данных пользователей после сохранения элемента списка.

...