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

Dynamics CRM中Xrm.Navigation.openConfirmDialog返回null问题求助

问题分析与解决方案

嗨,咱们来拆解一下你为什么会拿到null,以及怎么解决这个问题。

这个问题的核心在于异步操作的处理逻辑——Xrm.Navigation.openConfirmDialog是一个异步方法,它返回的是一个Promise对象,但你的confirmationBox函数目前并没有正确返回这个Promise链,导致调用时直接拿到了函数的默认返回值undefined(你看到的null应该是环境下的表现差异),而非你期望的true/false。

为什么原代码会返回null?

JavaScript里的异步操作不会阻塞代码执行:当你调用confirmationBox时,函数会立即执行到Xrm.Navigation.openConfirmDialog,然后直接结束函数(此时对话框还没被用户操作,.then()里的逻辑根本没跑)。由于你的函数没有返回任何值,temp就会被赋值为函数的默认返回值undefined,在你的环境中显示为null。

修复方案:让函数返回Promise链

只需要修改confirmationBox函数,让它返回Xrm.Navigation.openConfirmDialog的Promise链即可:

function confirmationBox(promptText, w, h) {
 var confirmationStrings = { text: promptText, title: "ConfirmationBox", cancelButtonLabel: "No", confirmButtonLabel: "Yes" };
 var confirmationDimension = { height: h, width: w };
 // 关键:返回整个Promise对象
 return Xrm.Navigation.openConfirmDialog(confirmationStrings, confirmationDimension).then(
 function (success) {
 if (success.confirmed) {
 console.log("Confirmed");
 return true;
 } else {
 console.log("Not Confirmed");
 return false;
 }
 });
}

正确的调用方式

因为现在函数返回的是Promise,你不能直接用var temp = confirmationBox(...)赋值,得用以下两种方式处理结果:

方式1:使用.then()链式调用

confirmationBox(promptText, 350, 450).then(function(result) {
 console.log(result); // 这里会正确拿到true或false
});

方式2:在async函数中使用await

如果你的上下文允许使用async/await(比如在另一个async函数里),可以这样写:

async function handleUserConfirmation() {
 var temp = await confirmationBox(promptText, 350, 450);
 console.log(temp); // 同样能拿到正确的true/false
}
// 调用这个async函数
handleUserConfirmation();

额外说明

你对success.confirmed的判断逻辑是完全正确的——这个属性就是Dynamics CRM用来标识用户点击了确认按钮(true)还是取消按钮(false)的,只需要把异步流程处理对就能拿到你想要的返回值了。

内容的提问来源于stack exchange,提问作者Mohsin A.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:11:22