Drupal 8页面间传参实现求助:自定义实体跳转携带ID需求
嘿,这个需求我之前帮不少人解决过,核心思路就是跳转时携带Application的ID作为参数,然后在Product页面读取这个参数,再关联查询对应的Application信息展示出来。我以模型驱动应用(比如Dynamics 365/Power Apps)为例,给你拆解具体实现步骤:
第一步:修改Application页面的Product跳转逻辑,带上来源ID
默认的关联字段跳转不会带额外参数,所以得自定义跳转行为,有两种常用方法:
方法1:用JavaScript覆盖字段的点击事件
在Application表单的OnLoad事件里添加一段脚本,替换Product字段的默认跳转,把当前Application的ID作为参数传过去:
function customizeProductLink(executionContext) { const formContext = executionContext.getFormContext(); const productControl = formContext.getControl("new_product"); // 替换成你的Product字段逻辑名 if (productControl && productControl.getAttribute().getValue()) { // 获取Product和当前Application的ID(去掉大括号) const productId = productControl.getAttribute().getValue()[0].id.replace(/[{}]/g, ""); const appId = formContext.data.entity.getId().replace(/[{}]/g, ""); // 覆盖默认点击事件,用带参数的方式打开Product表单 productControl.getLinkElement().onclick = (e) => { e.preventDefault(); Xrm.Navigation.openForm({ entityName: "new_product", entityId: productId, queryParams: { "sourceAppId": appId } }); }; } }
记得把代码里的字段逻辑名换成你自己的,还要给这个函数注册到表单的OnLoad事件里。
方法2:用自定义按钮替代默认链接
如果不想写脚本,也可以在Application表单上加个自定义按钮,点击后跳转到Product页面并携带ID。用Power Fx的话,按钮的公式大概是这样:
NavigateTo(Entity("new_product").Record(ThisItem.new_product), { QueryParameters: { sourceAppId: ThisItem.new_applicationid } })
这个方法更适合低代码场景,不用写JS。
第二步:在Product页面读取参数并展示Application信息
在Product表单的OnLoad事件里加脚本,读取URL里的sourceAppId参数,然后查询对应的Application记录,把信息展示到表单上:
function loadApplicationInfo(executionContext) { const formContext = executionContext.getFormContext(); const sourceAppId = Xrm.Utility.getGlobalContext().queryParameters.sourceAppId; if (sourceAppId) { // 查询Application的指定字段(替换成你需要展示的字段) Xrm.WebApi.retrieveRecord("new_application", sourceAppId, "?$select=new_name, new_description") .then(result => { // 把信息填充到Product表单的控件里(比如提前加个只读的多行文本框`new_applicationinfo`) formContext.getControl("new_applicationinfo").setVisible(true); formContext.getAttribute("new_applicationinfo").setValue( `来自Application: ${result.new_name}\n描述: ${result.new_description || '无'}` ); }, error => { console.error("加载Application信息失败:", error.message); }); } else { // 如果没有来源参数,隐藏展示控件 formContext.getControl("new_applicationinfo").setVisible(false); } }
这里要提前在Product表单上添加用来展示信息的控件(比如多行文本字段),并设置为只读,避免用户修改。
额外注意点
- 确保用户有读取Application实体的权限,不然查询会失败;
- 如果是画布应用,思路完全一致:跳转传参→目标页取参→查询展示,只是语法换成画布应用的Power Fx即可;
- 要是你是自定义开发的Web应用,核心逻辑还是传参+取参查询,可以用URL参数、localStorage等方式传递ID,具体语法根据你的技术栈调整。
内容的提问来源于stack exchange,提问作者Pascal Pivaty
相关产品推荐
相关产品推荐

