要将用户名保存到人员字段中:
在我的自定义表单中提供了一个人物编辑器控件,并按如下方式保存了每个已解析的实体:
if (currentPeopleEditor.Entities.Count != 0)
{
SPFieldUserValueCollection userCollection = new SPFieldUserValueCollection();
for (int index = 0; index < currentPeopleEditor.ResolvedEntities.Count; index++)
{
PickerEntity ObjEntity = (PickerEntity)currentPeopleEditor.ResolvedEntities[index];
userCollection.Add(new SPFieldUserValue(objSPWeb,Convert.ToInt32(ObjEntity.EntityData["SPUserID"]), ObjEntity.Key));
}
newItem[Field.Key.ToString()] = userCollection;
}
在某些用户声明获得此异常之前,它工作得非常好: &#34;无效的查找值
查找字段包含无效数据,请检查该值并重试。&#34;
在调查中我们发现发生此错误是因为 ObjEntity.EntityData [&#34; SPUserID&#34;])返回为null。
之所以发生这种情况,是因为要求保存一些不能访问此网站集的用户名,但他们是公司AD系统的成员。
答案 0 :(得分:0)
要解决此问题,我们会查看SharePoint并复制他们的操作。 在其中一个列表中添加一个类型为people and group的列,允许它选择任何用户。 在此列表中创建新项目并选择名称不在所有用户列表中的用户。 保存该项目。 返回到所有用户列表,您将看到新用户名已添加到此列表中。
注意:要在UI中查看所有用户列表,请浏览到以下位置: 网站集URL / _catalogs / users / simple.aspx
所以现在要实现相同的功能。我更新了代码如下
if (currentPeopleEditor.Entities.Count != 0)
{
SPFieldUserValueCollection userCollection = new SPFieldUserValueCollection();
for (int index = 0; index < currentPeopleEditor.ResolvedEntities.Count; index++)
{
PickerEntity ObjEntity = (PickerEntity)currentPeopleEditor.ResolvedEntities[index];
if (ObjEntity.EntityData["SPUserID"] == null)
{
SPContext.Current.Site.RootWeb.AllUsers.Add(ObjEntity.Key, ObjEntity.EntityData["Email"].ToString(), ObjEntity.DisplayText, "");
SPContext.Current.Site.RootWeb.Update();
userCollection.Add(new SPFieldUserValue(objSPWeb, Convert.ToInt32(SPContext.Current.Site.RootWeb.AllUsers[ObjEntity.Key].ID), ObjEntity.Key));
}
else
{ userCollection.Add(new SPFieldUserValue(objSPWeb, Convert.ToInt32(ObjEntity.EntityData["SPUserID"]), ObjEntity.Key));
}
}
newItem[Field.Key.ToString()] = userCollection;
}
答案 1 :(得分:0)
很长一段时间用于解决SharePoint 2010中的上述问题 web.EnsureUser()
它将用户添加到所有用户列表并返回spuser对象。