如何获取本地SharePoint列表项URL并添加至DataTable
首先直接回应你的核心疑问:
列表项的URL并不存储在默认的查找(Lookup)字段中。你可以通过列表项的内置属性或字段直接获取,完全不需要依赖查找字段。
一、获取列表项URL的两种实用方法
方法1:读取内置字段EncodedAbsUrl(推荐)
SharePoint的列表项自带一个EncodedAbsUrl内置字段,直接存储了列表项详情页的绝对URL,无需手动拼接,一步到位:
string itemAbsoluteUrl = value["EncodedAbsUrl"].ToString();
这个字段适用于所有类型的SharePoint列表(普通自定义列表、文档库等),拿到的就是可以直接访问的详情页链接。
方法2:手动拼接URL(适合自定义场景)
如果需要构造编辑页URL这类自定义格式的链接,可以通过站点URL、列表路径和项ID手动拼接:
// 获取当前站点的绝对URL string siteAbsoluteUrl = SP_List.Web.Url; // 提取列表的基础路径(移除默认视图的页面后缀) string listBasePath = oList.DefaultViewUrl.Replace("/AllItems.aspx", ""); // 构造详情页URL(如果要编辑页,把DispForm.aspx换成EditForm.aspx即可) string itemUrl = $"{siteAbsoluteUrl}{listBasePath}/DispForm.aspx?ID={value.Id}";
二、修改代码将URL添加到DataTable
下面是调整后的完整代码,包含添加URL列、获取URL并写入DataTable的逻辑,同时修正了原代码里的几个小问题:
System.Data.DataTable DT = new DataTable(); SP.List oList = SP_List.Web.Lists.GetByTitle(ListName); CamlQuery cQuery = new CamlQuery(); // 修正ViewXml的赋值语法(原代码@符号位置错误,导致XML标签解析异常) cQuery.ViewXml = @"<View><RowLimit>10</RowLimit></View>"; ListItemCollection ListCollection = oList.GetItems(cQuery); SP_List.Load(ListCollection); SP_List.ExecuteQuery(); // 添加原有普通字段列 for (int i = 0; i < ColumnName.Length; i++) DT.Columns.Add(ColumnName[i], System.Type.GetType("System.String")); // 添加原有查找字段列 for (int i = 0; i < LookUp.Length; i++) DT.Columns.Add(LookUp[i], System.Type.GetType("System.String")); // 新增列表项URL的列 DT.Columns.Add("ItemURL", System.Type.GetType("System.String")); foreach (ListItem value in ListCollection) { DataRow dr = DT.NewRow(); // 写入普通字段值,添加空值保护避免异常 for (int i = 0; i < ColumnName.Length; i++) dr[ColumnName[i]] = value[ColumnName[i]]?.ToString() ?? string.Empty; // 写入查找字段值,优化类型转换的空值处理 for (int i = 0; i < LookUp.Length; i++) { var lookupValue = value[LookUp[i]] as Microsoft.SharePoint.Client.FieldUserValue; dr[LookUp[i]] = lookupValue?.LookupValue ?? string.Empty; } // 写入列表项URL,同样做空值保护 dr["ItemURL"] = value["EncodedAbsUrl"]?.ToString() ?? string.Empty; DT.Rows.Add(dr); }
代码调整说明:
- 修正了
CamlQuery.ViewXml的赋值错误,把@放到字符串开头,避免XML标签转义问题; - 给所有字段赋值添加了
?? string.Empty空值保护,防止null.ToString()抛出空引用异常; - 优化了查找字段的类型转换逻辑,代码更安全易懂;
- 新增了
ItemURL列,并将获取到的列表项URL写入DataTable。
内容的提问来源于stack exchange,提问作者Karthick Srinivasan
相关产品推荐
相关产品推荐

