You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用C#获取SharePoint文档的自定义列/属性值?

解决SharePoint CSOM获取文件自定义属性的问题

嘿,这个问题我之前也踩过坑!原因很直白:默认调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:45:19