
在 dynamics 365 中,当用户处于新建联系人表单(创建模式)并尝试通过 javascript 导航至另一条已存在记录时,系统默认会弹出“是否保存更改”确认对话框。本文介绍如何通过临时禁用所有字段的提交模式,彻底屏蔽该提示,实现静默跳转。
在 dynamics 365 中,当用户处于新建联系人表单(创建模式)并尝试通过 javascript 导航至另一条已存在记录时,系统默认会弹出“是否保存更改”确认对话框。本文介绍如何通过临时禁用所有字段的提交模式,彻底屏蔽该提示,实现静默跳转。
在 Dynamics 365 模型驱动应用中,Xrm.Navigation.openForm() 在表单处于“未保存”状态(尤其是新建记录的草稿态)时,会强制触发浏览器级的导航拦截机制——即显示“您有未保存的更改,是否离开?”提示。该行为由客户端框架自动管理,无法通过参数或配置直接禁用,但可通过干预实体属性的提交行为实现绕过。
核心原理是:D365 的“未保存变更”检测依赖于字段的 submitMode 属性。只要至少一个字段的 submitMode 为 "always" 或 "dirty"(默认值),框架就认为存在待提交数据,从而触发离开确认。因此,解决方案是在导航前将所有字段的提交模式临时设为 "never",使系统判定“无须保存”,进而跳过弹窗。
✅ 推荐实现代码(兼容 v9.1+ 及 Unified Interface)
function navigateWithoutSaveConfirmation(formContext, targetRecordId) {
// Step 1: 禁用所有字段的提交(关键步骤)
const attributes = formContext.data.entity.attributes.get();
attributes.forEach(attr => {
attr.setSubmitMode("never");
});
// Step 2: 调用 openForm 导航(此时无弹窗)
Xrm.Navigation.openForm({
entityName: "contact",
entityId: targetRecordId,
openInNewTab: false
}).catch(error => {
console.error("Navigation failed:", error);
});
}
? 调用示例(在您的重复检测 Web 资源中双击某条候选记录时):
// 假设已获取目标 contact 的 GUID(如:"{8a2b3c4d-...}") navigateWithoutSaveConfirmation(executionContext.getFormContext(), targetContactId);
⚠️ 注意事项与最佳实践
-
作用范围仅限当前表单生命周期:
setSubmitMode("never")不影响数据持久化,仅改变本次导航前的客户端校验逻辑;用户后续手动点击保存仍可正常提交(前提是重新设回"always"或未被覆盖)。 -
无需恢复 submitMode:因用户已离开原表单,恢复操作无实际意义;若需支持“返回编辑”,建议结合
formContext.data.refresh(false)+ 手动重置字段状态。 -
不适用于离线场景:此方法依赖在线客户端行为,离线模式下
openForm本身受限,需额外处理。 -
权限与安全性:跳转目标记录需确保当前用户具有
Read权限,否则openForm将报错而非静默失败。 -
替代方案对比:
❌formContext.data.refresh(true)—— 强制保存草稿,违背“不保存原记录”需求;
❌window.location.href—— 破坏 D365 单页应用(SPA)体验,导致上下文丢失;
✅ 本方案保持 SPA 流畅性,且完全符合 Microsoft 官方推荐的setSubmitMode使用规范(Docs)。
通过这一轻量、稳定且官方支持的方式,您可在重复检测流程中提供无缝的用户体验:用户双击候选联系人,瞬间跳转至目标记录,全程无干扰弹窗,真正实现专业级业务流闭环。










