You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C#在Dynamics中实现Lookup查找字段的取值与赋值

Dynamics 365 同表单Lookup字段取值赋值实现

现有getSet实体表单创建了两个Lookup类型字段,需要读取表单左侧Lookup字段值,同步赋值给右侧对应字段。
你当前编写的代码存在两处核心错误:

  • 逻辑错误:读写的都是new_getlookup同一个字段,没有操作右侧的目标Lookup字段,根本无法实现跨字段赋值
  • 参数错误:实例化EntityReference时,第一个参数需要传入Lookup关联的目标实体逻辑名,你传入了字段名new_getlookup,运行时会直接抛出异常。

实现方案

方案1:表单前端JS实现(推荐,实时无刷新)

适合表单交互场景,用户选中左侧Lookup值后立刻同步到右侧,不需要保存表单,体验最优。

  1. 先确认字段信息:替换下面代码里的字段名、实体名为你实际环境的配置,假设左侧源字段为new_leftlookup,右侧目标字段为new_rightlookup
  2. 给左侧源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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 09:54:22