SharePoint列表创建项:人员字段的OData类型配置及填充问题
你遇到的核心问题是人员字段属于复杂类型,不能用Edm.String类型直接赋值——之前的代码把Assigned字段当成普通字符串处理了,这也是为什么传显示名称、ID或UPN都无效的原因。
下面是修正后的代码,我会给出两种常用的正确写法:
方法1:通过用户UPN(即Email)赋值
这种方式不需要提前获取用户在SharePoint站点的ID,只要有用户的UPN就能直接使用:
var fieldValueSet = new FieldValueSet(); fieldValueSet.AdditionalData = new Dictionary<string, object>(); // 保留你原来能正常工作的字段设置 fieldValueSet.AdditionalData.Add("Title@odata.type", "Edm.String"); fieldValueSet.AdditionalData.Add("Title", task.Title); fieldValueSet.AdditionalData.Add("Plan@odata.type", "Edm.String"); fieldValueSet.AdditionalData.Add("Plan", plan.Title); fieldValueSet.AdditionalData.Add("DueDate@odata.type", "Edm.String"); fieldValueSet.AdditionalData.Add("DueDate", task.DueDateTime); // 修正人员字段的类型和值结构 fieldValueSet.AdditionalData.Add("Assigned@odata.type", "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser"); fieldValueSet.AdditionalData.Add("Assigned", new { Email = assignee.UserPrincipalName // 这里传入用户的UPN/Email }); var listItem = new ListItem { Fields = fieldValueSet }; await graphServiceClient.Sites["SPURL:/sites/ITOddeleni:"].Lists["ListName"].Items .Request() .AddAsync(listItem);
方法2:通过用户的SharePoint站点ID赋值
如果你能获取到用户在当前SharePoint站点内的ID(可以通过Graph API的/sites/{site-id}/users接口查询),可以用这种方式,效率会更高:
// 其他字段设置同上... fieldValueSet.AdditionalData.Add("Assigned@odata.type", "#Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser"); fieldValueSet.AdditionalData.Add("Assigned", new { LookupId = 123 // 替换为用户在当前站点的实际ID });
额外注意事项
- 确认
Assigned是你列表中人员字段的内部名称:如果字段显示名有空格或特殊字符,内部名称会被自动转换(比如“Assigned To”的内部名称可能是AssignedTo或Assigned_x0020_To),可以在列表设置的字段详情页查看。 - 如果是多人字段,需要把值改成数组,同时类型也要调整为集合类型:
fieldValueSet.AdditionalData.Add("Assigned@odata.type", "#Collection(Microsoft.Azure.Connectors.SharePoint.SPListExpandedUser)"); fieldValueSet.AdditionalData.Add("Assigned", new[] { new { Email = "user1@domain.com" }, new { Email = "user2@domain.com" } }); - 确保你的Graph API应用拥有足够权限:至少需要
Sites.ReadWrite.All或者目标站点的Sites.ReadWrite权限。
内容的提问来源于stack exchange,提问作者Marek Kyzivát
相关产品推荐
相关产品推荐

