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

如何为自适应卡片的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返回的业务数据后,在业务代码层做两步处理即可:
    1. 把API返回的原始数据,映射成ChoiceSet要求的{title: 展示文本, value: 提交值}格式数组
    2. 把生成好的数组,直接替换卡片JSON里对应ChoiceSet组件的choices字段值,再把组装完成的完整卡片JSON发给渲染端即可
      以JS环境为例,核心代码如下:
// 提前调试好保存的卡片模板
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:18:22