You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:51:18