Dynamics CRM 2016本地部署:openDialog无法等待返回值求助
Dynamics CRM 2016 弹窗返回值问题解决
问题核心
Xrm.Internal.openDialog是异步方法,调用后不会阻塞后续代码执行,所以你看到的debugger直接运行是正常行为。返回值的处理必须放在它的回调函数中,而非方法调用之后的代码里。同时需确认弹窗页面的返回值传递逻辑是否符合CRM 2016的标准规范。
修正步骤
1. 调整主页面(第一个页面)代码
将需要等待返回值后执行的逻辑(比如debugger)移到回调函数内,确保只有弹窗关闭后才会触发:
function Click() { var Entity = "calendar"; var Select = "?$select=name"; var Filter = "&$filter=type eq 1"; var addParams; window.parent.Xrm.WebApi.retrieveMultipleRecords(Entity, Select + Filter).then( function success(result) { if (result != null && result.entities != null) { for (var i = 0; i < result.entities.length; i++) { if (i == 0) addParams= "Param="+result.entities[i].name; else addParams+= "&Param="+result.entities[i].name; } var DialogOption = new window.parent.Xrm.DialogOptions; DialogOption.width = 400; DialogOption.height = 400; var webresourceurl = "/WebResources/calendarPage?Data=" + encodeURIComponent(addParams); window.parent.Xrm.Internal.openDialog( webresourceurl, DialogOption, null, null, function (returnValue) { alert(returnValue); debugger; // 移到回调内,弹窗关闭后才执行调试 } ); // 这里的代码会在弹窗打开后立即执行,不会等待弹窗关闭 } }, function (error) { alert("error" + error.message); } ); }
2. 修正弹窗页面(第二个页面)的返回值传递逻辑
在CRM 2016中,弹窗关闭并传递返回值需使用官方内置方法,替换自定义的closeWindow:
function getValue() { var ele = document.getElementsByTagName('input'); var returnValue; for (var i = 0; i < ele.length; i++) { // 声明局部变量i,避免全局污染 if (ele[i].type == 'radio' && ele[i].checked) { alert(' Valore: ' + ele[i].value); sessionStorage.setItem('name', ele[i].value); returnValue = ele[i].value; break; // 找到选中项后跳出循环,提升效率 } } // 先设置返回值,再关闭弹窗 window.parent.Mscrm.Utilities.setReturnValue(returnValue); window.parent.Mscrm.Utilities.closeDialog(); }
额外注意事项
- 确保弹窗页面的Web资源已在CRM中正确发布,路径
/WebResources/calendarPage无误。 - 本地部署环境下,
window.parent上下文默认有效,无需额外处理跨域问题。
内容的提问来源于stack exchange,提问作者Burg0
相关产品推荐
相关产品推荐

