Dynamics CRM Online表单禁用自动保存后HTML Web资源仍触发保存如何解决
问题根因
Dynamics 365 表单的addOnSave注册的回调执行顺序早于你在表单层面配置的preventDefault逻辑,且preventDefault只会阻止表单最终的提交动作,不会中断已经触发的addOnSave回调链,因此你在HTML Web资源中注册的保存函数依然会执行。
解决方案
直接修改Web资源中addOnSave的绑定逻辑,在执行保存前先判断当前保存场景是否符合要求,过滤自动保存和已被取消的保存事件即可:
// 修改后的HTML Web资源后台代码 async created: function () { // addOnSave回调会自动传入表单执行上下文 window.parent.Xrm.Page.data.entity.addOnSave(async (context) => { const eventArgs = context.getEventArgs(); // 过滤自动保存场景 + 已被其他逻辑阻止的保存场景 if (eventArgs.getSaveMode() === 70 || eventArgs.isDefaultPrevented()) { return; } await saveData(this); }); } saveData : async function() { let results = await window.parent.Xrm.WebApi.online.executeMultiple(modifiedrecords); for (let resultsub in results) { const result = results[resultsub]; if (result.ok) { // 你的业务逻辑 } } }
补充说明
- 注意原
saveData方法用到了await,需要加上async修饰符否则会报错 - 如果你不需要和表单的保存动作绑定,也可以直接在Web资源中增加独立的保存按钮,手动触发
saveData逻辑,完全避免和表单保存事件的耦合 window.parent.Xrm.Page属于已废弃的旧API,后续版本升级可能会失效,建议逐步替换为官方推荐的Xrm.Utility.getGlobalContext等新API
内容的提问来源于stack exchange,提问作者MVC_Nhibernate
相关产品推荐
相关产品推荐

