如何为自适应卡片的ChoiceSet传入动态选项数组?
向自适应卡片ChoiceSet传入动态选项数组实现方案
- 先明确ChoiceSet的选项结构要求
不管是单选还是多选模式,ChoiceSet的选项都存储在组件的choices字段下,每个选项固定包含两个属性:title对应用户可见的选项展示文本,value对应用户选中后提交到后端的标识值,基础结构示例如下:
{ "type": "Input.ChoiceSet", "id": "businessSelect", "isMultiSelect": true, "choices": [ {"title": "测试选项1", "value": "opt_001"}, {"title": "测试选项2", "value": "opt_002"} ] }
- 设计器调试阶段无需硬编码全量选项
编写卡片模板时,先给choices字段留空数组,或者放2-3个测试用占位选项即可,优先把卡片整体布局、选中后的提交动作、交互逻辑调通,不需要在设计阶段绑定真实业务数据。 - 运行时动态注入选项的具体逻辑
自适应卡片本身是纯JSON结构,没有特殊的动态绑定黑魔法,拿到API返回的业务数据后,在业务代码层做两步处理即可:- 把API返回的原始数据,映射成ChoiceSet要求的
{title: 展示文本, value: 提交值}格式数组 - 把生成好的数组,直接替换卡片JSON里对应ChoiceSet组件的
choices字段值,再把组装完成的完整卡片JSON发给渲染端即可
以JS环境为例,核心代码如下:
- 把API返回的原始数据,映射成ChoiceSet要求的
// 提前调试好保存的卡片模板 const cardTemplate = { type: "AdaptiveCard", version: "1.3", body: [ { type: "TextBlock", text: "请选择需要操作的业务项", weight: "Bolder", size: "Medium" }, { type: "Input.ChoiceSet", id: "selectedItems", isMultiSelect: true, choices: [] // 预留的动态选项位 } ], actions: [ { type: "Action.Submit", title: "确认执行" } ] } // 调用API获取业务数据 const apiRes = await getBusinessList() // 转换为ChoiceSet兼容的选项格式 const dynamicChoices = apiRes.data.map(item => ({ title: item.displayName, // 替换为自身业务需要展示的字段 value: item.bizId // 替换为自身业务的唯一标识字段 })) // 注入动态选项 cardTemplate.body[1].choices = dynamicChoices // 拿到最终可渲染的卡片JSON const finalCard = cardTemplate
- 特殊场景适配
- 如果你用的宿主环境支持自适应卡片模板化能力,可以直接在模板的
choices字段写数据绑定表达式,把API返回的数据作为数据源传入模板引擎自动渲染,不用手动替换JSON字段,适合模板和业务逻辑分离的场景。 - 单选场景只需要把组件的
isMultiSelect属性设为false,选项注入逻辑和多选完全一致,不需要额外调整。 - 注入选项前记得做判空处理,如果API返回空数据,可以提前插入一条
{"title": "暂无可用选项", "value": ""}的占位选项,避免组件渲染空白。
- 如果你用的宿主环境支持自适应卡片模板化能力,可以直接在模板的
内容的提问来源于stack exchange,提问作者Sara Shreim
相关产品推荐
相关产品推荐

