SP 2013调用REST API获取文档库项时Name、MyCol字段返回undefined如何解决
问题原因
- SharePoint REST API 默认不会返回全部列表字段,仅返回默认视图包含的字段以及部分内置字段。你能正常获取
JobTitle是因为该字段被包含在默认返回集中,而自定义字段MyCol、图片类型字段不在默认返回范围内,所以未被带回。 - 字段的显示名与内部名不匹配:SharePoint 中字段的显示名称和实际的内部调用名可能存在差异,比如文档库内置的文件名称字段的内部名是
FileLeafRef而非Name,直接访问Name属性自然返回undefined。如果是自定义的图片类型Name列,你需要先确认它的真实内部名,且图片类型字段为嵌套对象,需要显式展开才能读取内部的URL属性。 - 请求参数配置错误:你仅写了
expand=Name但没有通过$select指定需要获取的字段,也没有对正确的对象(比如文件对象File、图片类型字段对象)做展开,导致需要的字段没有被返回。
解决方案
第一步:确认字段内部名
进入文档库的列表设置页面,点击MyCol、Name列的标题,查看浏览器地址栏中Field=参数后的值,就是该字段的真实内部名,后续调用需要使用这个内部名。
第二步:修改REST请求参数
在请求URL中添加$select显式声明所有你需要获取的字段,同时添加$expand展开嵌套类型的字段(比如文件对象、图片类型字段)。
以下是两种常见场景的修改示例:
场景1:Name对应文档库存储的文件本身,需要获取文件访问URL
<script> $.ajax ({ // 显式指定需要的字段,展开File对象获取文件相对路径 url: _spPageContextInfo.webAbsoluteUrl+"/_api/web/lists/getbytitle('photos')/items?$select=FileLeafRef,MyCol,JobTitle,File/ServerRelativeUrl&$expand=File", dataType: 'json', // 建议删除async:false,同步请求会阻塞页面渲染 headers: { "Accept": "application/json;odata=verbose" }, success: function(data) { var html = ''; var count = 0; for(var result in data.d.results) { var item = data.d.results[result]; // FileLeafRef是文件名,File.ServerRelativeUrl是文件的完整相对路径可直接访问 html+='Name:' + item.File.ServerRelativeUrl + '<br>'; html+='MyCol:' + item.MyCol + '<br>'; html+='Job Title:' + item.JobTitle + '<br><br>'; count++; if(count >= 6) break; } $('#staffInformation').append(html); }, error: function ajaxError(response){ console.log(response.status + ' ' + response.statusText); } }); </script>
场景2:Name是你自定义的图片类型列,内部名为Name
<script> $.ajax ({ // 展开图片类型字段Name获取内部的Url属性 url: _spPageContextInfo.webAbsoluteUrl+"/_api/web/lists/getbytitle('photos')/items?$select=Name,MyCol,JobTitle&$expand=Name", dataType: 'json', headers: { "Accept": "application/json;odata=verbose" }, success: function(data) { var html = ''; var count = 0; for(var result in data.d.results) { var item = data.d.results[result]; // 图片类型字段展开后取Url属性 html+='Name:' + item.Name.Url + '<br>'; html+='MyCol:' + item.MyCol + '<br>'; html+='Job Title:' + item.JobTitle + '<br><br>'; count++; if(count >= 6) break; } $('#staffInformation').append(html); }, error: function ajaxError(response){ console.log(response.status + ' ' + response.statusText); } }); </script>
内容的提问来源于stack exchange,提问作者Pete Whelan
相关产品推荐
相关产品推荐

