SharePoint 2013:如何从查询字符串设置依赖组合框字段?
我之前在SP2013里踩过一模一样的坑——SP2010那套JS方案完全失效,就是因为字段渲染后的ID和名称彻底变了。给你几个亲测有效的解决办法,分场景对应:
场景1:使用默认新建项目表单(原生表单)
默认表单里字段可见但无法赋值,核心是要找到SP2013渲染后组合框的真实DOM标识,然后用JS从查询字符串取参数赋值。
步骤如下:
- 打开新建表单,按F12打开开发者工具,定位到那个关联父列表的组合框元素。你会发现它的ID不是像SP2010那样简单的
ctl00_..._FieldName,而是类似ctl00_ctl33_g_xxxx_xxxx_ctl00_ctl04_ctl03_ctl00这种随机生成的长ID,或者name属性是ctl00$ctl33$g_xxxx$xxxx$ctl00$ctl04$ctl03$ctl00。 - 把下面的JS代码添加到表单的内容编辑器Web部件里(或者通过SP Designer编辑表单页面插入脚本):
// 获取查询字符串参数 function getQueryStringParam(paramName) { var urlParams = new URLSearchParams(window.location.search); return urlParams.get(paramName); } // 页面加载完成后执行 _spBodyOnLoadFunctionNames.push("setParentLookupValue"); function setParentLookupValue() { // 替换成你找到的组合框的ID var lookupFieldId = "ctl00_ctl33_g_xxxx_xxxx_ctl00_ctl04_ctl03_ctl00"; // 替换成你的查询字符串参数名,比如ParentID var parentId = getQueryStringParam("ParentID"); if (parentId) { var lookupField = document.getElementById(lookupFieldId); if (lookupField) { // 设置组合框的选中值 lookupField.value = parentId; // 触发字段的change事件,确保SP识别到值已更新 var event = new Event('change'); lookupField.dispatchEvent(event); } } }
- 注意:如果你的关联字段允许多选,逻辑会稍微调整,需要处理数组值,但单选中上面的代码完全可用。
场景2:使用InfoPath自定义表单
InfoPath里查询字符串Web部件失效的话,直接在InfoPath内部绑定查询参数更靠谱:
- 打开InfoPath表单模板,点击数据选项卡 → 接收数据 → 创建新连接 → 接收数据 → SharePoint库或列表,下一步选择你的父列表,勾选需要的字段(至少包含ID和显示字段)。
- 点击数据选项卡 → 表单参数,添加一个新参数,比如命名为
ParentID,类型设为文本或数字(根据父列表ID类型)。 - 回到表单设计,选中关联父列表的组合框控件,右键 → 属性 → 数据选项卡 → 选择字段或组,找到刚才创建的父列表数据连接里的ID字段。
- 设置默认值:点击默认值旁边的fx按钮,插入公式 → 插入函数 → 操作 → 从查询字符串获取值,在参数名里填入你的查询字符串参数名(比如
ParentID),确定保存。 - 发布表单到SharePoint,测试的时候带上查询参数(比如
?ParentID=1),组合框会自动加载对应的父项。
场景3:用REST API预加载并赋值(更稳定的方案)
如果上面两种方案都有问题,可以用SP2013的REST API先获取父列表项的信息,再给字段赋值,这种方式不受DOM结构变化影响:
function getQueryStringParam(paramName) { var urlParams = new URLSearchParams(window.location.search); return urlParams.get(paramName); } function setLookupViaREST() { var parentId = getQueryStringParam("ParentID"); if (!parentId) return; // 替换成你的父列表相对URL,比如"/sites/yourSite/Lists/ParentList" var parentListUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/lists/getbytitle('ParentList')/items(" + parentId + ")"; $.ajax({ url: parentListUrl, method: "GET", headers: { "Accept": "application/json; odata=verbose" }, success: function(data) { // 获取父项的显示文本和ID var parentTitle = data.d.Title; var parentItemId = data.d.ID; // 找到关联字段的输入控件(SP2013里lookup字段会有两个输入框,一个存ID,一个存显示文本) var lookupIdInput = document.querySelector("input[id*='ParentLookupField'][id$='_Lookup']"); var lookupTextInput = document.querySelector("input[id*='ParentLookupField'][id$='_Lookup_Display']"); if (lookupIdInput && lookupTextInput) { lookupIdInput.value = parentItemId; lookupTextInput.value = parentTitle; // 触发change事件 lookupIdInput.dispatchEvent(new Event('change')); } }, error: function(error) { console.log("Error fetching parent item: ", error); } }); } _spBodyOnLoadFunctionNames.push("setLookupViaREST");
这里需要注意,要确保页面加载了jQuery(SP2013默认会加载,如果没有的话可以手动引入),另外ParentLookupField要替换成你关联字段的内部名称的一部分,用*=模糊匹配就能找到对应的控件。
内容的提问来源于stack exchange,提问作者TheOriginalCole
相关产品推荐
相关产品推荐

