Dynamics CRM中OnLoad事件设置字段值及报错解决
解决Xrm.Page.getAttribute("needs")返回null导致setValue报错的问题
嘿,咱们先把这个错误的本质搞清楚:你看到的Cannot read property 'setValue' of null,根本不是因为新建记录的字段为空,而是你要操作的那个needs字段,在当前的新建表单里根本找不到——Xrm.Page.getAttribute("needs")返回了null,自然没法调用它的setValue方法了。
下面给你一步步排查和解决的思路:
1. 先确认字段的逻辑名称是否完全正确
Xrm.Page.getAttribute()要求传入的是字段的逻辑名称,不是界面上的显示名称。比如你界面上看到的字段叫“需求”,它的逻辑名可能是new_needs(带解决方案前缀),而不是简单的needs。
怎么查逻辑名称?
- 打开Dynamics 365的解决方案,找到对应的实体(也就是你新建记录所属的实体)
- 进入实体的字段列表,找到目标字段,查看它的“逻辑名称”属性——这个名称是小写、无空格,通常包含自定义前缀。
如果逻辑名称写错了,改成正确的即可。
2. 检查字段是否已经添加到当前的新建表单布局里
就算字段在实体中存在,但如果没把它拖到你正在使用的新建(Create)表单的布局里,Xrm.Page是访问不到这个字段的。
操作步骤:
- 进入实体的表单编辑器,选择你当前用的新建表单
- 检查表单的各个分区(section),确认
needs字段已经被添加进去(哪怕设置成隐藏状态也没关系,只要在表单里就能被访问) - 如果没添加,把字段从右侧字段列表拖到表单里,保存并发布表单后再测试。
3. 给表单加载留足够时间(可选排查)
有时候OnLoad事件触发时,表单的字段还没完全初始化完成,导致暂时取不到属性。这种情况可以试试延迟执行代码,比如:
function copyCatNewRecord(){ setTimeout(function(){ var xml = "<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false' count='1'>" + "<entity name='needs'>" + "<attribute name='needsid' />" + "<attribute name='needsname' />" + "<order attribute='modifiedon' descending='true' />" + "</entity></fetch>"; var ret = frameworkGlobal.ExecuteFetchRequest(xml); if(ret && ret.length > 0){ var currValue = ret[0].needsid.Value; var needsAttr = Xrm.Page.getAttribute("needs"); if(needsAttr){ needsAttr.setValue(currValue); } else { console.log("警告:表单上找不到'needs'字段"); } } else { console.log("Fetch请求未返回任何记录"); } }, 500); // 延迟500毫秒执行,给表单足够初始化时间 }
不过这只是临时的调试手段,核心还是要确保字段确实在表单里。
4. 给代码加容错判断(推荐)
为了避免类似错误,建议在操作字段前先判断属性是否存在,就像上面代码里那样——先获取needsAttr,再判断它是否不为null,再调用setValue,这样哪怕字段有问题,也能在控制台看到明确的提示,方便调试。
内容的提问来源于stack exchange,提问作者Damkulul
相关产品推荐
相关产品推荐

