如何在Dynamics 365 CRM重复检测对话框隐藏/禁用Ignore and Save按钮
Dynamics 365 CRM 重复检测对话框隐藏/禁用"Ignore and Save"按钮方案
一、关于重复检测对话框的表单位置
重复检测对话框是系统原生内置组件,不属于CRM表单编辑器中可查看、编辑的自定义表单范畴,所以你无法在CRM界面找到它的存储位置,只能通过前端脚本或插件逻辑修改其行为。
二、禁用/隐藏"Ignore and Save"按钮的可行方案
方案1:前端JavaScript脚本(推荐)
通过DOM操作定位对话框按钮并修改状态,步骤如下:
- 在目标实体的表单上注册OnLoad事件脚本,或使用Web资源实现全局注入(覆盖所有实体的重复检测场景)
- 监听DOM变化,捕获对话框加载事件后定位按钮:
对话框的"Ignore and Save"按钮通常可通过button[data-id="ignoreandsave"]选择器定位,示例代码:// 监听DOM结构变化,检测重复对话框加载 const observer = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.addedNodes.length) { const ignoreSaveBtn = document.querySelector('button[data-id="ignoreandsave"]'); if (ignoreSaveBtn) { // 禁用按钮 ignoreSaveBtn.disabled = true; // 若需隐藏按钮,替换为以下代码 // ignoreSaveBtn.style.display = 'none'; observer.disconnect(); // 找到目标后停止监听 } } }); }); observer.observe(document.body, { childList: true, subtree: true }); - 注意:该方法依赖CRM界面DOM结构,若微软更新界面可能失效,需定期验证适配。
方案2:插件实现(修正错误写法)
插件需从数据层面拦截重复保存,而非直接操作对话框。之前插件出错大概率是消息、阶段选择错误,正确逻辑如下:
- 注册插件到目标实体的Create或Update消息的PreValidation阶段
- 在插件中检测重复记录,若存在则抛出异常阻止保存,替代"Ignore and Save"功能:
using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; public class BlockDuplicateSave : IPlugin { public void Execute(IServiceProvider serviceProvider) { IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId); // 仅处理创建/更新操作 if (context.MessageName != "Create" && context.MessageName != "Update") return; Entity target = (Entity)context.InputParameters["Target"]; // 调用系统接口检测重复记录 RetrieveDuplicatesRequest duplicateReq = new RetrieveDuplicatesRequest { BusinessEntity = target, MatchingEntityName = target.LogicalName, PagingInfo = new PagingInfo { PageNumber = 1, Count = 10 } }; RetrieveDuplicatesResponse duplicateResp = (RetrieveDuplicatesResponse)service.Execute(duplicateReq); if (duplicateResp.DuplicateCollection.Entities.Count > 0) { // 抛出异常阻止保存,替代忽略重复的选项 throw new InvalidPluginExecutionException("检测到重复记录,无法保存。"); } } } - 插件错误排查:检查注册的消息、阶段是否匹配,插件执行账户权限是否足够,异常处理是否规范。
三、注意事项
- 前端脚本需确保在对话框加载后执行,MutationObserver是可靠的监听方式
- 插件方式从数据层面彻底阻止重复保存,用户体验为直接报错,而非隐藏按钮
- 若需针对特定角色用户控制按钮状态,可在脚本中加入角色判断逻辑
内容的提问来源于stack exchange,提问作者Femi Orunmbe
相关产品推荐
相关产品推荐

