前几个月做的一个项目需要根据Item中Approver字段的人员来判断权限。
我的思路是通过Infopath自带函数UserName()来检查用户是否Approver,奈何Approver是多选People,而infopath中判断用的Approve.AccountID只能取到第一个。
于是想通过客户端模型查看一下这个Approver的People字段到底存储的是什么信息。
测试用的list为下图:
于是通过var users= item["Approver"];发现这个字段是个FieldUserValue类型的数组。
修改代码为FieldUserValue []users= item["Approver"] as FieldUserValue[];
然后问题又来了 FieldUserValue可用的属性只有Lookupid (一个数字)和Lookupvalue(DisplayName)
我就琢磨着能不能转换成User来取得LoginName,好的搜索一下SPFieldUserValue转换SPUser
代码倒是一大堆,谁告诉我FieldUserValue哪来的User属性了=-=
但是倒是提醒我了,能不能先转换成FieldUser,直接as试试看= =好吧,失败了。
!!!好吧,那我新建一个用户总行了吧,开UserCreationInformation,好吧没有loginname我注定还是失败。
最后看到这个http://www.cnblogs.com/McJeremy/archive/2009/08/03/1537876.html
既然它group通过lookupid能取到,那么我试试user能不能呢?结果竟然成功了!!最后贴上代码
[WebMethod]
public List<string> Test()
{
//通过用户名和网址返回该用户在该网站下组的名集合
List<string> Usernames = new List<string>();
ClientContext clientContext = new ClientContext("http://w01sps0104/");
string user = System.Configuration.ConfigurationManager.AppSettings["AgengcyUser"].ToString();
string pwd = System.Configuration.ConfigurationManager.AppSettings["AgengcyPwd"].ToString();
clientContext.Credentials = new NetworkCredential(user, pwd); //代理登陆身份
Web site = clientContext.Web;
List ListGoal = site.Lists.GetByTitle("Test");
ListItem item = ListGoal.GetItemById("1");
clientContext.Load(item);
clientContext.ExecuteQuery();
FieldUserValue []users= item["Approver"] as FieldUserValue[];
Microsoft.SharePoint.Client.UserCollection Users = site.SiteUsers;
for (int i = 0; i < users.Length; i++)
{
Microsoft.SharePoint.Client.User userx = Users.GetById(users[i].LookupId);
clientContext.Load(userx);
clientContext.ExecuteQuery();
string mail = userx.LoginName;
Usernames.Add(mail);
}
return Usernames;
}