我正在为SharePoint列表编写ItemAdding处理程序,该列表包含多用户字段。由于此时SPItem实际上不可用,我认为我已经降级为使用从SPItemEventDataCollection返回的字符串。当user1,user2和user3存在时,该字符串将如下所示:
1; #MYDOMAIN \ USER1;#4; #MYDOMAIN \ USER2;#10; #MYDOMAIN \用户3
我想将其转换为SPUser对象数组,以便将其传递给另一个现有方法。是否有任何SharePoint内置方法来处理这些字符串,还是我降级为解析此字符串?
另外,假设我需要处理这个字符串,看起来这里的整数标记总是对应于后面的域\用户名。是否有任何情况,这将不是真的,整数或域\用户名丢失或不正确?使用数字并使用SPWeb的SiteUsers.GetByID(id)方法是否安全?在一些测试中,我无法让它失败,但如果它们完全是多余的,那么数字和字符串数据都会被包含在内似乎很奇怪。
谢谢!
答案 0 :(得分: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继承其行为,该标准SPFieldLookup还存储ID和Title,并具有相应的SPFieldLookupValueCollection。该ID支持(弱)参照完整性,而缓存的值允许快速查询。
答案 1 :(得分:0)
这适用于从用户字段获取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用户数据库中用户的id。但是,这是未同步的,因此用户可能已从用户数据库中删除,因为列表项已保存。