Dynamics 365中无需父实体GUID,用JS自动填充自定义实体
解决Dynamics 365中根据关联实体自动填充表单字段的问题
我明白你刚接触客户端脚本,翻遍了谷歌和社区还是卡在动态获取Agent GUID、自动填充数据这两步。结合你已经写好的静态代码,我帮你调整成完全适配需求的动态版本,一步步解决问题:
步骤1:绑定字段触发事件
先打开cts_cases的表单设计器,找到关联cts_agent的那个Agent ID字段(假设字段逻辑名称是cts_agentid),给它添加一个OnChange事件,指定调用我们的填充函数populateAgentDetails。
步骤2:编写动态填充的完整脚本
下面是修改后的代码,关键改动我都标出来了:
function populateAgentDetails(executionContext) { // 获取表单上下文(推荐用这个替代旧版Xrm.Page,兼容新版环境) var formContext = executionContext.getFormContext(); var agentLookup = formContext.getAttribute("cts_agentid").getValue(); // 先判断是否选中了Agent记录 if (agentLookup && agentLookup.length > 0) { // 动态提取Agent的GUID,注意去掉前后大括号(Web API要求格式) var agentId = agentLookup[0].id.replace(/[{}]/g, ""); var clientUrl = Xrm.Page.context.getClientUrl(); var req = new XMLHttpRequest(); // 替换静态GUID为动态获取的agentId req.open("GET", clientUrl + "/api/data/v9.1/cts_agents(" + agentId + ")?$select=cts_addressline1,cts_addressline2,cts_addressline3,cts_city,cts_country,cts_email,cts_fax,cts_mobilenumber,cts_name,cts_phonenumber,cts_state,cts_zipcode", true); req.setRequestHeader("OData-MaxVersion", "4.0"); req.setRequestHeader("OData-Version", "4.0"); req.setRequestHeader("Accept", "application/json"); req.setRequestHeader("Content-Type", "application/json; charset=utf-8"); req.setRequestHeader("Prefer", "odata.include-annotations=\"*\""); req.onreadystatechange = function() { if (this.readyState === 4) { req.onreadystatechange = null; if (this.status === 200) { var result = JSON.parse(this.response); // 把Agent数据逐个填充到cts_cases的对应字段 formContext.getAttribute("cts_addressline1").setValue(result["cts_addressline1"]); formContext.getAttribute("cts_addressline2").setValue(result["cts_addressline2"]); formContext.getAttribute("cts_addressline3").setValue(result["cts_addressline3"]); formContext.getAttribute("cts_city").setValue(result["cts_city"]); formContext.getAttribute("cts_country").setValue(result["cts_country"]); formContext.getAttribute("cts_email").setValue(result["cts_email"]); formContext.getAttribute("cts_fax").setValue(result["cts_fax"]); formContext.getAttribute("cts_mobilenumber").setValue(result["cts_mobilenumber"]); formContext.getAttribute("cts_name").setValue(result["cts_name"]); formContext.getAttribute("cts_phonenumber").setValue(result["cts_phonenumber"]); formContext.getAttribute("cts_state").setValue(result["cts_state"]); formContext.getAttribute("cts_zipcode").setValue(result["cts_zipcode"]); } else { Xrm.Utility.alertDialog(this.statusText); } } }; req.send(); } else { // 如果用户清空了Agent选择,同步清空所有填充的只读字段 formContext.getAttribute("cts_addressline1").setValue(null); formContext.getAttribute("cts_addressline2").setValue(null); formContext.getAttribute("cts_addressline3").setValue(null); formContext.getAttribute("cts_city").setValue(null); formContext.getAttribute("cts_country").setValue(null); formContext.getAttribute("cts_email").setValue(null); formContext.getAttribute("cts_fax").setValue(null); formContext.getAttribute("cts_mobilenumber").setValue(null); formContext.getAttribute("cts_name").setValue(null); formContext.getAttribute("cts_phonenumber").setValue(null); formContext.getAttribute("cts_state").setValue(null); formContext.getAttribute("cts_zipcode").setValue(null); } }
关键细节说明
- 动态获取GUID:通过
agentLookup[0].id拿到选中Agent的ID,用replace(/[{}]/g, "")去掉前后大括号,这是Web API请求的格式要求。 - 表单上下文:用
executionContext.getFormContext()是官方推荐的写法,比直接用Xrm.Page更适配新版Dataverse环境。 - 自动填充逻辑:拿到返回的JSON数据后,通过
formContext.getAttribute("字段逻辑名").setValue(值)把数据写入对应字段,完全自动化。 - 清空处理:当用户取消选择Agent时,自动清空所有只读字段,避免残留无效数据。
额外注意事项
- 确保代码里的字段/实体逻辑名称和你的实际环境一致,比如
cts_agentid如果你的字段名不同,要替换成真实名称。 - 提前在表单设计器里把需要填充的字段设置为只读,防止用户手动修改。
内容的提问来源于stack exchange,提问作者subhajit seal
相关产品推荐
相关产品推荐

