如何用JS阻止销售订单取消?Mscrm取消按钮代码插入位置咨询
如何用JS阻止Dynamics 365销售订单的取消操作?
针对你的两个问题,我给你梳理下实际项目里常用的落地方案,都是经过验证的靠谱方法:
一、核心思路:拦截原生按钮的执行流程
原生的Mscrm.Form.salesorder.CancelOrder按钮属于系统命令栏按钮,我们要做的就是在它执行原生取消逻辑之前,插入自定义校验代码——如果校验触发了阻止条件,就中断默认操作并给用户提示。
二、具体实现步骤
1. 编写带校验逻辑的JavaScript函数
先写一个自定义函数,用来处理你的校验规则,并且在需要时阻止原生操作。示例代码如下:
function validateBeforeCancel(executionContext) { // 获取当前表单的上下文对象,这是获取表单数据的关键 const formContext = executionContext.getFormContext(); // 这里替换成你的实际校验逻辑,比如检查订单状态、自定义字段值等 // 举个例子:如果订单已完成支付,就不允许取消 const isPaid = formContext.getAttribute("new_ispaymentcompleted").getValue(); if (isPaid) { // 给用户弹出友好提示 Xrm.Navigation.openAlertDialog({ text: "抱歉,该订单已完成支付,无法取消,请联系管理员处理!" }); // 关键操作:阻止原生取消按钮的默认执行逻辑 executionContext.getEventArgs().preventDefault(); } }
2. 将函数注册到CancelOrder按钮的前置事件
因为是系统原生按钮,推荐用Ribbon Workbench(Dynamics 365自定义命令栏的专用工具,操作直观)来配置:
- 打开Ribbon Workbench,加载销售订单实体的命令栏配置。
- 找到
Cancel Order按钮对应的系统Command(一般就是Mscrm.Form.salesorder.CancelOrder)。 - 给这个Command添加一个Custom Action,设置为「前置执行」(也就是原生逻辑跑之前先执行我们的函数)。
- 选择你上传到环境中的JS web资源,指定刚才写的
validateBeforeCancel函数,一定要勾选「传递执行上下文」(不然拿不到executionContext就没法阻止默认操作)。
3. 测试验证
保存并发布命令栏配置后,打开销售订单表单点击取消按钮,就能触发你的校验逻辑了——如果符合阻止条件,会弹出提示,且不会执行原生的取消操作。
三、关于校验代码插入位置的解答
你的校验代码就放在上面这种前置拦截函数里,通过executionContext.getEventArgs().preventDefault()来中断原生按钮的默认流程。这个函数会在原生取消逻辑执行前被调用,完美匹配你的需求:先校验数据,再决定是否允许执行原有功能。
内容的提问来源于stack exchange,提问作者Damkulul
相关产品推荐
相关产品推荐

