Dynamics 365 CRM如何获取双选项集值并通过JS禁用表单字段
解决方案
核心问题原因
Dynamics 365 双选项集(Yes/No)字段取值异常通常由以下几个常见问题导致:
- 字段逻辑名称拼写错误:Dynamics 365 的字段名区分大小写,需确认
opu_paid和实际系统中配置的逻辑名称完全一致,包括前缀、下划线、大小写 - 未处理空值场景:双选项集字段
getValue()的返回值包含三种状态:true(勾选/Yes)、false(未勾选/No)、null(字段未赋值、表单加载未完成),原有代码未处理null的情况会导致判断逻辑失效 - 执行时机错误:如果代码仅在表单加载时执行一次,没有绑定到
opu_paid的onChange事件,勾选状态变化后不会触发后续的禁用逻辑
修正后可运行代码
以下代码同时支持表单加载时自动执行、复选框状态变化时自动触发,还新增了批量禁用所有字段的逻辑,无需逐个指定控件:
// 表单加载事件入口函数,注册时需勾选"传递执行上下文作为第一个参数" function onFormLoad(executionContext) { var formContext = executionContext.getFormContext(); // 绑定复选框变化事件 formContext.getAttribute("opu_paid").addOnChange(onPaidStatusChange); // 表单加载时先执行一次逻辑 onPaidStatusChange(executionContext); } // 复选框状态变化触发逻辑 function onPaidStatusChange(executionContext) { var formContext = executionContext.getFormContext(); // 获取复选框值,空值按照未勾选处理 var isPaid = formContext.getAttribute("opu_paid").getValue() ?? false; // 兼容低版本浏览器可替换为以下写法: // var isPaid = formContext.getAttribute("opu_paid").getValue() === true; // 批量遍历所有控件设置禁用状态,不需要逐个指定字段 formContext.ui.controls.forEach(function(control) { // 跳过opu_paid控件本身,避免勾选后无法修改 if(control.getName() === "opu_paid") return; // 仅处理字段类型的控件,跳过子网格、选项卡等非字段控件 if(control.getControlType() === "standard" || control.getControlType() === "lookup" || control.getControlType() === "optionset") { control.setDisabled(!isPaid); } }); }
部署说明
- 注册
onFormLoad函数到表单的On Load事件,必须勾选「传递执行上下文作为第一个参数」选项 - 如果不需要保留
opu_paid的编辑权限,可以删掉逻辑里跳过该控件的判断行
内容的提问来源于stack exchange,提问作者AdmDTR
相关产品推荐
相关产品推荐

