System.NullReferenceException: 未将对象引用设置到对象的实例!

XellowsD3 2012-06-11 11:42:50

using (SPWeb web = site.OpenWeb(webID))
{
SPList list = web.Lists[listID];
SPListItem item = list.GetItemById(itemID); //取到想要设置的记录
if ("UserMulti" == field.TypeAsString) //判断该字段是否设置了“允许多重选择”
{
SPFieldUserValueCollection members = (SPFieldUserValueCollection)item[field.Title]; //取出所有数据内容
foreach (SPFieldUserValue member in members)
{
if (member.User != null) //判断该对象是否是用户类型
{
principal.AddUser(member.User); //添加用户
}
else
{
try
{
SPGroup group = web.SiteGroups[member.LookupValue]; //获取用户组
principal.AddGroup(group); //添加用户组
}
catch
{
continue;
}
}
}
}


在foreach | 这里报错:System.NullReferenceException: 未将对象引用设置到对象的实例。
...全文
276 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Justin-Liu 2012-06-14
  • 打赏
  • 举报
回复
空引用的问题就不要再问了好么,调试一下就知道哪个是null了,别告诉我你不会调,问带你的人
xiaozhudan1110 2012-06-13
  • 打赏
  • 举报
回复
先确定一下传入的两个参数web和field的internalname是不是正确,然后看看你取得那个item的这个field属性是不是有值。
这是Sharepoint提供的标准API,各个值都对的话应该不会有错。
XellowsD3 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
SPFieldUserValueCollection members = new SPFieldUserValueCollection(web,field.InternalName);
[/Quote]
用你的方法取的话,虽然不报错了,但是单步调试的时候,member还是为null。取不到数据,更不同谈下面取用户了
XellowsD3 2012-06-11
  • 打赏
  • 举报
回复
功能概要:通过编写一个ItemAdded事件,根据列表中的栏“查看者”和“编辑者”,授予编辑者对该记录具有【编辑】的权限,并授予查看者对该记录仅具有【查看】的权限,实现了文档的动态权限分配。
XellowsD3 2012-06-11
  • 打赏
  • 举报
回复
这个Event Receiver的完整代码

using System;
using System.Collections.Generic;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Workflow;


namespace DOC.EventReceiver1
{
//用户或组存放类
public class UsersAndGroups
{
List<SPUser> userList;
List<SPGroup> groupList;

public List<SPGroup> GroupList
{
get { return groupList; }
set { groupList = value; }
}

public List<SPUser> UserList
{
get { return userList; }
set { userList = value; }
}

public UsersAndGroups()
{
userList = new List<SPUser>();
groupList = new List<SPGroup>();
}

public UsersAndGroups(List<SPUser> _users, List<SPGroup> _groups)
{
userList = new List<SPUser>();
groupList = new List<SPGroup>();
this.userList = _users;
this.groupList = _groups;
}

public void AddUser(SPUser _user)
{
this.userList.Add(_user);
}

public void AddGroup(SPGroup _group)
{
this.groupList.Add(_group);
}
}

public class EventReceiver1 : SPItemEventReceiver
{


//项目添加事件后的处理
public override void ItemAdded(SPItemEventProperties properties)
{
SPListItem item = properties.ListItem; //获取当前记录
Guid siteID = properties.SiteId;
Guid webID = properties.Web.ID;
Guid listID = properties.ListId;

//获取查看者、编辑者信息
UsersAndGroups leaders = GetUserAndGroupByField(siteID, webID, listID, item.ID, properties.List.Fields["查看者"]);
UsersAndGroups members = GetUserAndGroupByField(siteID, webID, listID, item.ID, properties.List.Fields["编辑者"]);

bool success = SetRoleAssignment(siteID, webID, listID, item.ID, leaders, members);
}

//通过字段获取用户或组
private UsersAndGroups GetUserAndGroupByField(Guid siteID, Guid webID, Guid listID, int itemID, SPField field)
{
UsersAndGroups principal = new UsersAndGroups();
try
{
SPSecurity.RunWithElevatedPrivileges(delegate() //提升权限,以保证普通用户登录,也能取到用户及组信息
{
using (SPSite site = new SPSite(siteID))
{
using (SPWeb web = site.OpenWeb(webID))
{
SPList list = web.Lists[listID];
SPListItem item = list.GetItemById(itemID); //取到想要设置的记录
if ("UserMulti" == field.TypeAsString) //判断该字段是否设置了“允许多重选择”
{
SPFieldUserValueCollection members = (SPFieldUserValueCollection)item[field.Title]; //取出所有数据内容
foreach (SPFieldUserValue member in members)
{
if (member.User != null) //判断该对象是否是用户类型
{
principal.AddUser(member.User); //添加用户
}
else
{
try
{
SPGroup group = web.SiteGroups[member.LookupValue]; //获取用户组
principal.AddGroup(group); //添加用户组
}
catch
{
continue;
}
}
}
}
else
{
string strUser = item[field.Title].ToString();
string loginName = strUser.Split('#')[1];
SPUser member = web.EnsureUser(loginName);
principal.AddUser(member);

}
}
}
});
return principal;
}
catch(Exception e)
{
Console.WriteLine(e.Message);
return null;

}
}

//权限设置
private bool SetRoleAssignment(Guid siteID, Guid webID, Guid listID, int itemID, UsersAndGroups leaders, UsersAndGroups members)
{
bool success = false;
try
{
SPSecurity.RunWithElevatedPrivileges(delegate() //提升权限,以保证普通用户登录,也能取到用户及组信息
{
using (SPSite site = new SPSite(siteID))
{
using (SPWeb web = site.OpenWeb(webID))
{
web.AllowUnsafeUpdates = true; //允许对网站进行不安全修改
SPList list = web.Lists[listID];
SPListItem item = list.GetItemById(itemID);


item.BreakRoleInheritance(false); //断开该条记录的继承


//获取该条记录当前所有用户\组的权限
SPRoleAssignmentCollection itemRoleAssignments = item.RoleAssignments;


//获取当前网站的所有权限级别
SPRoleDefinitionCollection roleDefinitions = web.RoleDefinitions;


//添加查看者查看的权限
SPRoleDefinition leaderRoleDefinition = roleDefinitions["查看"]; //定义查看者查看的权限级别
foreach (SPUser user in leaders.UserList)
{
SPRoleAssignment leaderRoleAss = new SPRoleAssignment(user); //定义一条权限级别,并指定用户
leaderRoleAss.RoleDefinitionBindings.Add(leaderRoleDefinition); //绑定该权限级别的具体权限(查看)
itemRoleAssignments.Add(leaderRoleAss);
}
foreach (SPGroup group in leaders.GroupList)
{
SPRoleAssignment leaderRoleAss = new SPRoleAssignment(group);
leaderRoleAss.RoleDefinitionBindings.Add(leaderRoleDefinition);
itemRoleAssignments.Add(leaderRoleAss);
}


//添加编辑者编辑的权限
SPRoleDefinition memberRoleDefinition = roleDefinitions["编辑"];
foreach (SPUser user in members.UserList)
{
SPRoleAssignment leaderRoleAss = new SPRoleAssignment(user);
leaderRoleAss.RoleDefinitionBindings.Add(memberRoleDefinition);
itemRoleAssignments.Add(leaderRoleAss);
}
foreach (SPGroup group in members.GroupList)
{
SPRoleAssignment leaderRoleAss = new SPRoleAssignment(group);
leaderRoleAss.RoleDefinitionBindings.Add(memberRoleDefinition);
itemRoleAssignments.Add(leaderRoleAss);
}
item.SystemUpdate(false);
web.AllowUnsafeUpdates = false;
}
}
});
return success;
}
catch
{
return false;
}
}

}
}

xiaozhudan1110 2012-06-11
  • 打赏
  • 举报
回复
SPFieldUserValueCollection members = new SPFieldUserValueCollection(web,field.InternalName);

3,245

社区成员

发帖
与我相关
我的任务
社区描述
企业开发 SharePoint
社区管理员
  • SharePoint社区
  • 霖雨 - LinyuLoveTJ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧