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资源:
- 首先在表单的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); }
- 在你的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来操作:
- 表单中打开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 }); }
- 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




