如何在2sxc DNN模块模态窗口中获取当前编辑实体的id、guid数据
2sxc自定义字段获取当前编辑实体ID/GUID/类型的正确方法
不要通过爬DOM、解析iframe地址、读取内部未暴露全局对象的方式取值,这些方式要么取值不准,要么跨版本会失效。2sxc自定义字段的标准运行时上下文已经自带所有你需要的实体信息,直接取用即可:
方法1:初始化时从入参获取上下文
2sxc加载你的自定义字段JS时,会自动向初始化方法注入完整的运行上下文,这是官方推荐的最稳定的取值方式:
- 编辑已有实体时,返回的是当前实际打开编辑的实体数据,哪怕是嵌套在应用设置等非页面实体编辑场景下,取值也和外层iframe传参无关,完全准确
- 新建实体时,实体ID为0(保存后才会生成正式ID),但GUID会在初始化阶段预生成,可正常使用
- 返回的实体类型是系统静态名称,不是UI上可自定义的多语言显示标签
示例代码:
// 你的自定义字段入口文件 /system/field-string-my-custom-field/index.js export function init(context) { // 核心实体数据 const currentEntityId = context.entity.id; const currentEntityGuid = context.entity.guid; const currentEntityTypeName = context.entity.type.name; // 以下写你的字段业务逻辑即可 }
方法2:运行时从字段DOM节点取上下文
如果你的代码结构没有在初始化阶段保存上下文对象,也可以直接从自定义字段对应的DOM节点上读取绑定的上下文,不需要查找全局的formBuilderRef对象:
// 替换为你的自定义字段对应的DOM容器选择器 const fieldWrap = document.querySelector('[data-field-group="你的字段系统名"]'); // 2sxc渲染字段时会自动将上下文绑定到DOM节点的该属性上 const fieldContext = fieldWrap.__2sxcFieldContext; // 取值和初始化入参完全一致 const { id, guid, type: { name: typeName } } = fieldContext.entity;
避坑提醒
- 禁止从iframe的src解析
EntityId参数:该参数是弹窗首次打开时的外层上下文ID,当你在编辑界面嵌套打开其他实体(比如应用配置、关联子实体编辑弹窗)时,该参数不会更新,取值完全不匹配 - 禁止解析弹窗顶部标题获取实体类型:标题是支持多语言、自定义修改的显示文本,和实体系统类型名没有固定对应关系
- 禁止直接依赖全局
formBuilderRef对象:该对象是2sxc内部未对外暴露的实现细节,版本迭代时属性名、挂载位置随时可能调整,没有兼容性保障
内容的提问来源于stack exchange,提问作者Constantine Ketskalo
相关产品推荐
相关产品推荐

