Teams中Adaptive Card的Input.ChoiceSet在Action.Submit时不返回更新值
问题分析与解决方案
你的机器人在Microsoft Teams环境下,首次应用过滤能正常返回默认值,但二次修改过滤条件后无法获取选中值,而本地Bot Framework模拟器功能正常,核心原因是Teams与模拟器的卡片状态管理逻辑差异:模拟器会自动保留用户输入状态,但Teams不会,必须通过显式的卡片更新机制同步状态。
具体解决方案
1. 改用卡片更新机制,替换重复发送新卡片
当用户点击「Apply Filter」后,不要发送全新卡片,而是更新原有卡片的状态,确保Teams能识别最新的用户选择:
// 处理APPLY FILTER动作 if (context.activity.value.action === "APPLY FILTER") { // 直接从提交数据中获取用户选择的过滤值 const userSelections = { id_1: context.activity.value.id_1 || [], id_2: context.activity.value.id_2 || [], id_3: context.activity.value.id_3 || [], id_4: context.activity.value.id_4 || [] }; // 复制原卡片模板并更新选中状态 const updatedCard = JSON.parse(JSON.stringify(system_adaptive_card)); // 更新每个ChoiceSet的选中值 ["id_1", "id_2", "id_3", "id_4"].forEach(id => { const inputElement = updatedCard.body.find(item => item.id === id); if (inputElement) { inputElement.value = userSelections[id]; } }); // 更新原有卡片(而非发送新卡片) await context.updateActivity({ id: context.activity.replyToId, attachments: [CardFactory.adaptiveCard(updatedCard)], attachmentLayout: "carousel" }); }
2. 移除Submit按钮中的手动数据绑定
原Submit按钮的data字段手动绑定{id_1.value}等值,在Teams中二次提交时可能无法同步最新状态。改为仅传递动作标识,所有输入值直接从context.activity.value中获取:
{ "type": "Action.Submit", "title": "Apply Filter", "data": { "action": "APPLY FILTER" } }
3. 同步控件可见性状态
更新卡片时,需保留当前控件的可见性状态(比如哪些过滤选项是展开的)。可以在对话状态中记录可见性信息,更新卡片时同步设置对应元素的isVisible属性。
4. 验证Teams的自适应卡片版本兼容性
虽然你使用的是1.5版本,但Teams对部分新特性的支持可能存在延迟,可尝试将卡片版本降级到1.4测试是否解决问题:
"version": "1.4"
核心逻辑说明
Teams不会自动维护卡片的输入状态,每次用户交互后,必须通过updateActivity方法将用户的选择同步回卡片,确保后续提交动作能获取到最新的选中值。而本地模拟器默认帮你处理了状态保留,因此不会出现该问题。
内容的提问来源于stack exchange,提问作者Pedro Azevedo
相关产品推荐
相关产品推荐

