如何使用C#获取SharePoint文档的自定义列/属性值?
嘿,这个问题我之前也踩过坑!原因很直白:默认调用clientContext.Load(listItems)时,CSOM只会加载ListItem的基础属性,自定义列不会被自动拉取,而且自定义属性其实是挂在ListItem本身上的,不是File对象的属性——所以你直接访问item.File.Location肯定拿不到值。
下面给你两种实用的解决方法:
方法一:明确指定要加载的自定义列(推荐,性能更优)
在加载ListItemCollection的时候,用Include()方法精准列出你需要的所有字段,包括标准属性和自定义列。这里要注意:必须用列的内部名称(Internal Name),不是显示名称,很多人都在这里栽跟头!
修改后的核心代码如下:
// CAML查询部分保持不变 CamlQuery camlQuery = new CamlQuery(); camlQuery.ViewXml = @"<View Scope='RecursiveAll'> <Query> </Query> </View>"; camlQuery.FolderServerRelativeUrl = folder.ServerRelativeUrl; ListItemCollection listItems = list.GetItems(camlQuery); // 重点:明确声明要加载的属性,包含自定义列 clientContext.Load(listItems, items => items.Include( item => item.File, // 加载File对象以获取标准属性 item => item.File.Author, item => item.File.ModifiedBy, item => item["Location"], // 自定义列:使用内部名称 item => item["Path"], // 自定义列:使用内部名称 item => item["Flat"] // 自定义列:使用内部名称 )); clientContext.ExecuteQuery(); // 循环读取属性 foreach (var item in listItems) { // 标准属性正常获取 var author = item.File.Author; var modifiedBy = item.File.ModifiedBy; // 自定义属性通过item["内部名称"]获取,记得做类型转换 var location = item["Location"] as string; var path = item["Path"] as string; var flat = item["Flat"] as bool?; // 如果是布尔类型的列 // 后续业务逻辑... }
方法二:加载列表所有字段(适合不确定自定义列的场景)
如果你不清楚具体要加载哪些自定义列,可以先加载列表的所有字段,再让CSOM拉取ListItem的全部属性。这种方式灵活性高,但性能略逊于方法一:
// 先加载列表的所有字段集合 clientContext.Load(list, l => l.Fields); clientContext.ExecuteQuery(); // 构建查询后,加载ListItemCollection时默认拉取所有属性 ListItemCollection listItems = list.GetItems(camlQuery); clientContext.Load(listItems); // 也可以更明确:clientContext.Load(listItems, items => items.IncludeWithDefaultProperties(item => item.File)); clientContext.ExecuteQuery(); // 循环读取自定义属性 foreach (var item in listItems) { var location = item["Location"] as string; // 其他自定义属性同理... }
关键提醒:确认自定义列的内部名称
如果按上面的代码还是拿不到值,大概率是你用了显示名称而非内部名称。怎么查内部名称?
- 打开SharePoint列表的列设置页面,看浏览器地址栏的URL,里面有
Field=XXX的参数,XXX就是内部名称(比如显示名称是“文件位置”,内部名称可能是FileLocation) - 也可以用CSOM代码直接获取:
var field = list.Fields.GetByInternalNameOrTitle("Location"); clientContext.Load(field, f => f.InternalName); clientContext.ExecuteQuery(); Console.WriteLine(field.InternalName); // 输出真实的内部名称
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

