如何通过SharePoint REST API与CSOM获取带值的视图列表项?
嘿,我来帮你理清这个问题!你调用/_api/lists/getbytitle('EvertList')/views返回的只是视图的定义信息(比如视图名称、列配置、筛选规则这些),并不是视图对应的实际列表项数据。要获取带值的视图列表项,得换个思路,下面分别说REST API和CSOM的实现方式:
REST API 获取视图对应的列表项
核心思路是:先拿到目标视图的查询规则(ViewQuery)和列配置(ViewFields),再用这些信息构造请求去获取符合视图规则的列表项。
步骤1:获取目标视图的关键属性
先发起GET请求,拿到视图的查询语句和要返回的列:
GET http://win-lfl4bgulf29/_api/lists/getbytitle('EvertList')/views/getbytitle('你的视图名称')?$select=ViewQuery,ViewFields
返回结果里的ViewQuery就是视图的筛选/排序规则,ViewFields是视图要展示的列集合。
步骤2:用视图规则请求列表项
发起POST请求到列表的getitems接口,把视图规则放到请求体里:
POST http://win-lfl4bgulf29/_api/lists/getbytitle('EvertList')/getitems Content-Type: application/json { "query": { "ViewXml": "<View><Query>这里替换成步骤1拿到的ViewQuery</Query><ViewFields>这里替换成步骤1拿到的ViewFields</ViewFields></View>" } }
这样返回的结果就是该视图下所有符合规则的列表项,包含视图配置的列对应的值。
使用CSOM实现需求
当然可以用CSOM实现,不管是原生.NET CSOM还是PnP CSOM都能轻松搞定,下面给你两个示例:
原生.NET CSOM示例
using Microsoft.SharePoint.Client; using System; var siteUrl = "http://win-lfl4bgulf29"; using (var ctx = new ClientContext(siteUrl)) { // 本地环境用默认凭证,线上环境按需配置认证 ctx.Credentials = System.Net.CredentialCache.DefaultCredentials; // 获取目标列表和视图 var list = ctx.Web.Lists.GetByTitle("EvertList"); var targetView = list.Views.GetByTitle("你的视图名称"); ctx.Load(targetView, v => v.ViewQuery, v => v.ViewFields); ctx.ExecuteQuery(); // 构造CAML查询,复用视图的规则 var camlQuery = new CamlQuery(); camlQuery.ViewXml = $"<View><Query>{targetView.ViewQuery}</Query><ViewFields>{targetView.ViewFields.SchemaXml}</ViewFields></View>"; // 获取视图对应的列表项 var viewItems = list.GetItems(camlQuery); ctx.Load(viewItems); ctx.ExecuteQuery(); // 遍历处理列表项 foreach (var item in viewItems) { Console.WriteLine($"标题:{item["Title"]}"); // 其他字段根据视图配置的列名获取即可 } }
PnP CSOM简化示例
如果用PnP CSOM,代码会更简洁:
using PnP.Core.Model.SharePoint; using PnP.Core.Services; using System.Threading.Tasks; var siteUrl = "http://win-lfl4bgulf29"; using (var context = await PnPContextFactory.CreateAsync(siteUrl)) { // 获取列表和视图 var list = await context.Web.Lists.GetByTitleAsync("EvertList"); var targetView = await list.Views.GetByTitleAsync("你的视图名称", p => p.ViewQuery, p => p.ViewFields); // 构造查询并获取项 var camlQuery = new CamlQuery { ViewXml = $"<View><Query>{targetView.ViewQuery}</Query><ViewFields>{targetView.ViewFields.SchemaXml}</ViewFields></View>" }; var viewItems = await list.GetItemsAsync(camlQuery); // 处理项逻辑 foreach (var item in viewItems) { // 你的业务代码 } }
简单总结下:你之前的接口只获取了视图的“配置”,要拿实际数据得结合视图的查询规则去请求列表项,两种方案都能完美满足你的需求~
内容的提问来源于stack exchange,提问作者Ali varzeshi
相关产品推荐
相关产品推荐

