如何阻止MSCRM 365中插件更新Lookup值时触发JavaScript OnChange事件?
解决Dynamics 365 CRM中插件更新Lookup字段触发OnChange事件的问题
嘿 Amar,这个问题在Dynamics 365里挺常见的——系统默认不管是用户手动操作,还是插件/API这类服务器端操作,只要字段值发生变更,都会触发字段的OnChange事件。不过咱们有几个靠谱的办法能区分触发场景,让插件更新时跳过你的JS逻辑,给你详细说说:
方案1:通过事件上下文判断触发来源(最推荐)
Dynamics 365的executionContext对象里包含了事件的触发源信息,你可以在OnChange函数里通过getEventArgs().getDataSource()来判断:
- 当用户手动在表单上修改字段时,数据源是
"Form" - 当插件/API等服务器端操作更新字段时,数据源是
"Server"
直接在你的JS函数里加个判断就行,示例代码如下:
function onLookupFieldChange(executionContext) { const eventArgs = executionContext.getEventArgs(); // 检查是否是服务器端(插件/API)触发的变更 if (eventArgs.getDataSource() === "Server") { return; // 直接退出,不执行后续手动操作逻辑 } // 这里放你原本需要在手动修改时执行的代码 console.log("执行手动修改后的逻辑"); }
这个方法不需要额外创建字段,完全利用系统自带的上下文信息,简单高效。
方案2:新增标记字段区分操作类型
如果你的场景需要更灵活的控制,可以创建一个隐藏的布尔型字段(比如命名为new_ispluginupdate),插件更新Lookup字段时同时把这个标记设为true,然后在JS的OnChange事件里检查这个标记,决定是否执行逻辑:
插件端(C#示例)
// 假设你正在更新的实体是target target["new_lookupid"] = new EntityReference("account", new Guid("你的记录ID")); // 设置插件更新标记 target["new_ispluginupdate"] = true;
JavaScript端
function onLookupFieldChange(executionContext) { const formContext = executionContext.getFormContext(); const isPluginUpdate = formContext.getAttribute("new_ispluginupdate").getValue(); if (isPluginUpdate) { // 重置标记字段,避免影响后续操作 formContext.getAttribute("new_ispluginupdate").setValue(false); return; // 跳过手动操作逻辑 } // 原本的手动修改逻辑 }
记得把这个标记字段设置为表单上的隐藏字段,不要让用户看到。
补充说明
需要注意的是,OnChange事件只有当字段的实际值发生变化时才会触发,如果插件更新的Lookup值和当前表单上的值一致,是不会触发这个事件的。所以上面的方案都是针对值确实发生变更的场景。
内容的提问来源于stack exchange,提问作者amar bisht
相关产品推荐
相关产品推荐

