Dynamics CRM 2016中JS无法清除Lookup字段值的问题排查
解决Dynamics CRM 2016 Lookup字段无法清除的问题
我来帮你排查下这段代码里的几个关键问题——这些都是CRM表单脚本开发里容易踩的小坑,正是它们导致Lookup字段无法被正确清除:
1. 错误的字段存在性/空值判断
你代码里的第一个判断:
if(Xrm.Page.getAttribute("new_activitycategory1id") == null){ return; }
这个逻辑完全错了。在Dynamics CRM里,Xrm.Page.getAttribute()只要字段在表单上存在,哪怕它没有值,都会返回一个Attribute对象,绝不会返回null——只有当字段根本不在当前表单上时,才会返回null。所以这个判断永远不会触发,哪怕你已经把字段值设为null,代码还是会继续往下走。
正确的做法是同时检查字段是否存在,以及字段是否有值:
var categoryAttr = Xrm.Page.getAttribute("new_activitycategory1id"); // 字段不存在 或者 字段没有值,直接返回 if (!categoryAttr || !categoryAttr.getValue()) { return; }
2. 未处理Lookup值为空的边界情况
在你获取category1[0].id之前,没有判断category1是否为空。如果字段本来就没值,category1 = categoryAttr.getValue()会返回null,这时你去访问category1[0].id会直接抛出JavaScript错误,导致后面的清除代码根本没机会执行。
所以必须先确保category1不为空,再去读取它的ID:
var category1 = categoryAttr.getValue(); if (!category1) { return; } var category1Data = category1[0].id;
3. 清除后强制提交空值(可选但推荐)
有时候即使调用了setValue(null),CRM可能因为表单缓存或者字段默认提交模式的问题,没有正确更新UI或者把空值提交到服务器。你可以在清除后加上setSubmitMode("always"),强制让这个字段的空值被提交:
categoryAttr.setValue(null); categoryAttr.setSubmitMode("always"); // 确保空值被服务器接收
修正后的完整代码
function preventSavinf3940category(){ var categoryAttr = Xrm.Page.getAttribute("new_activitycategory1id"); // 检查字段是否存在、是否有值 if (!categoryAttr || !categoryAttr.getValue()) { return; } var category1 = categoryAttr.getValue(); var category1Data = category1[0].id; var students = getId(1); var teachers = getId(2); if(category1Data === teachers || category1Data === students) { categoryAttr.setValue(null); categoryAttr.setSubmitMode("always"); alert("this category is not in use anymore"); } }
最后还有两个小提醒:
- 函数名里的
preventSavinf应该是preventSaving的笔误,虽然不影响功能,但建议修正下避免后续维护混淆。 - 确认
getId()返回的ID格式和Lookup字段的ID完全一致(都是带大括号的格式,比如{12345678-1234-1234-1234-1234567890AB}),如果格式不匹配,你的条件判断会永远不成立。
内容的提问来源于stack exchange,提问作者Damkulul
相关产品推荐
相关产品推荐

