使用C#在Dynamics中实现Lookup查找字段的取值与赋值
Dynamics 365 同表单Lookup字段取值赋值实现
现有getSet实体表单创建了两个Lookup类型字段,需要读取表单左侧Lookup字段值,同步赋值给右侧对应字段。
你当前编写的代码存在两处核心错误:
- 逻辑错误:读写的都是
new_getlookup同一个字段,没有操作右侧的目标Lookup字段,根本无法实现跨字段赋值 - 参数错误:实例化
EntityReference时,第一个参数需要传入Lookup关联的目标实体逻辑名,你传入了字段名new_getlookup,运行时会直接抛出异常。
实现方案
方案1:表单前端JS实现(推荐,实时无刷新)
适合表单交互场景,用户选中左侧Lookup值后立刻同步到右侧,不需要保存表单,体验最优。
- 先确认字段信息:替换下面代码里的字段名、实体名为你实际环境的配置,假设左侧源字段为
new_leftlookup,右侧目标字段为new_rightlookup - 给左侧源Lookup字段绑定
OnChange事件,传入执行上下文,绑定以下函数:
function syncLookup(executionContext) { const formCtx = executionContext.getFormContext(); const leftValue = formCtx.getAttribute("new_leftlookup").getValue(); const rightAttr = formCtx.getAttribute("new_rightlookup"); if (leftValue && leftValue.length > 0) { rightAttr.setValue([{ id: leftValue[0].id, entityType: leftValue[0].entityType, name: leftValue[0].name }]); } else { rightAttr.setValue(null); } }
注意:绑定事件时必须勾选「将执行上下文作为第一个参数传递」选项,否则无法获取表单上下文报错。
方案2:服务端插件/代码实现(保存后强制同步)
如果需要从数据层面保证两个字段值一致,不管是表单录入还是接口、其他流程写入数据都要同步,可以在实体Pre-Operation阶段注册插件,代码如下:
// 读取左侧源Lookup字段值 if (entGetSet.Contains("new_leftlookup")) { EntityReference leftRef = entGetSet.GetAttributeValue<EntityReference>("new_leftlookup"); // 赋值给右侧目标字段,直接复用源字段的实体名和ID,不需要多余的Guid转字符串再转回的操作 entGetSet["new_rightlookup"] = new EntityReference(leftRef.LogicalName, leftRef.Id); } else { // 源字段清空时同步清空目标字段 entGetSet["new_rightlookup"] = null; }
注意:不要使用把Guid转成字符串再重新实例化Guid的冗余写法,既影响性能又容易引入格式转换错误。
内容的提问来源于stack exchange,提问作者Azam Khan
相关产品推荐
相关产品推荐

