You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Dynamics 365 V9中如何在HTML Web资源中获取Form Context?

我之前在处理Dynamics 365的HTML Web资源时也碰到过一模一样的问题!你遇到的undefined问题,本质是因为每个HTML Web资源都是运行在独立的iframe中的,你在表单脚本里定义的全局formContext变量,没法跨iframe被其他Web资源访问到。下面给你几个靠谱的解决方法:

解决方法1:直接通过parent.Xrm获取Form Context

这个方法最简单,适用于表单中嵌入的HTML Web资源(因为Web资源和父表单同域)。HTML Web资源作为iframe嵌入在表单里,所以可以通过parent对象访问到父页面的Xrm实例,进而获取Form Context:

// 在你的HTML Web资源的脚本里直接写这段代码
var formContext = parent.Xrm.Page.getFormContext();
// 验证一下是否获取成功
console.log("拿到的Form Context:", formContext);

注意:如果是较新版本的Dynamics 365,推荐使用getFormContext(),而不是直接用Xrm.Page(后者是旧版API,虽然现在还能用,但未来可能被弃用)。

解决方法2:通过表单控件传递Form Context(适合嵌入型Web资源)

如果你的HTML Web资源是直接嵌入在表单中的控件,还可以在表单加载时主动把Form Context传递给Web资源:

  1. 首先在表单的OnLoad事件中注册脚本,传递executionContext:
function formLoadHandler(executionContext) {
    var formContext = executionContext.getFormContext();
    // 替换成你HTML Web资源控件的名称
    var webResourceControl = formContext.getControl("WebResource_MyHTMLControl");
    // 获取Web资源对应的iframe元素
    var webResourceFrame = webResourceControl.getObject();
    
    // 确保iframe加载完成后再传递上下文,避免报错
    setTimeout(function() {
        // 调用HTML Web资源中定义的函数,把Form Context传进去
        webResourceFrame.contentWindow.receiveFormContext(formContext);
    }, 1000);
}
  1. 在你的HTML Web资源中定义接收函数:
let formContext;
// 接收来自表单的Form Context
function receiveFormContext(context) {
    formContext = context;
    console.log("成功接收Form Context:", formContext);
    // 现在你就可以用这个上下文来刷新控件了
    // 示例:刷新某个字段控件
    formContext.getControl("new_TargetField").refresh();
}
解决方法3:弹出Web资源时传递参数(适合弹窗型Web资源)

如果你的HTML Web资源是通过按钮或脚本弹出的,没法直接用parent访问,那可以通过传递实体ID/名称,再结合parent.Xrm来操作:

  1. 表单中打开Web资源的脚本:
function openMyWebResource(executionContext) {
    var formContext = executionContext.getFormContext();
    // 获取实体ID并去掉前后的大括号
    var entityId = formContext.data.entity.getId().replace(/[{}]/g, "");
    var entityName = formContext.data.entity.getEntityName();
    
    // 打开Web资源并传递参数
    Xrm.Navigation.openWebResource("new_MyPopupWebResource", {
        entityId: entityId,
        entityName: entityName
    });
}
  1. HTML Web资源中获取参数并操作:
// 封装一个获取URL参数的工具函数
function getUrlParam(paramName) {
    const params = new URLSearchParams(window.location.search);
    return params.get(paramName);
}

// 获取传递过来的实体信息
const entityId = getUrlParam("entityId");
const entityName = getUrlParam("entityName");

// 直接通过parent.Xrm获取Form Context,或者操作数据
const formContext = parent.Xrm.Page.getFormContext();
// 示例:刷新表单
formContext.data.refresh(false);

内容的提问来源于stack exchange,提问作者Bilal Hussain

火山引擎 最新活动