如何将SharePoint中的多用户字段字符串转换为SPUsers数组?

9
我正在为SharePoint列表编写ItemAdding处理程序,该列表包含多用户字段。由于此时SPItem实际上不可用,因此我认为只能使用从SPItemEventDataCollection返回的字符串。当user1、user2和user3存在时,该字符串将如下所示:
1;#MYDOMAIN\user1;#4;#MYDOMAIN\user2;#10;#MYDOMAIN\user3
我想将其转换为SPUser对象数组,以便将其传递到另一个现有方法中。是否有任何SharePoint内置的方法来处理这些字符串,或者我只能解析这个字符串?
此外,假设我需要处理此字符串,看起来这里的整数令牌始终对应于后面的domain\username。是否有任何情况下这不是正确的,或者整数或domain\username缺失或其他错误?直接使用数字并使用SPWeb的SiteUsers.GetByID(id)方法是否安全?在少数测试中,我无法使其失败,但如果完全重复,似乎奇怪将包括数字和字符串数据。
谢谢!

1
这就是为什么我不喜欢SharePoint开发的原因...就好像人们简单地忘记了思考一样。 - user166390
2个回答

16

SPFieldUserValueCollection恰好符合您的需求。它的构造函数接受一个SPWeb和一组用户字符串。集合中的SPFieldUserValue项提供一个User属性,该属性返回web的相应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。ID支持(弱)参照完整性,而缓存的Value允许快速查询。


0

这对我来说很有效,从用户字段中获取SPS用户。从事件数据中提取它应该是相同的事情。

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用户数据库中用户的ID。但是,这并没有同步,因此自列表项保存以来,用户可能已从用户数据库中删除。


谢谢。我基本上采取了这种方法,但是有一个额外的问题,即字段值中可能有多个用户。奇怪的是,如果我的字段中只有一个用户,则字段中只有数字值而不是“;”分隔的值。看起来仍然有效。 - Chris Farmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接