Adaptive Card动作未触发问题排查:Hero Card正常但Adaptive Card报错
Adaptive Card提交后流程终止且session.message无值的解决方案
我之前踩过一模一样的坑!Adaptive Card和Hero Card在Bot Framework里的交互逻辑确实不一样,尤其是提交事件的处理上。你的问题核心就是Adaptive Card的提交没有被Bot正确识别,导致session.message里拿不到有效数据,最终流程报错终止。下面给你拆解问题原因和解决办法:
核心原因分析
Hero Card的按钮默认是触发imBack或messageBack类型的交互,会直接把按钮文本作为消息文本传给Bot,所以session.message.text有值,流程能正常走。但Adaptive Card的提交是通过Action.Submit来传递结构化数据,这些数据不会放在session.message.text里,而是存在session.message.value中——如果你的后续流程还在盯着session.message.text拿值,自然会出现无值的情况,进而报错。
具体解决步骤
1. 正确配置Adaptive Card的提交按钮
首先要确保你的Adaptive Card里的提交按钮是Action.Submit类型,并且可以自定义一个标识字段方便后续识别:
bot.dialog("/FormSearch", [ function(session, args, next) { var card = { contentType: "application/vnd.microsoft.card.adaptive", content: { "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", "type": "AdaptiveCard", "version": "1.0", "body": [ // 这里放你的表单输入组件,比如搜索框 { "type": "Input.Text", "id": "searchQuery", "placeholder": "请输入搜索内容" } ], "actions": [ { "type": "Action.Submit", "title": "提交", "data": { "action": "formSearchSubmit" // 自定义标识,方便判断是表单提交 } } ] } }; // 一定要用builder.Message包装卡片再发送 var msg = new builder.Message(session).addAttachment(card); session.send(msg); }, // 这里是处理提交的后续环节 function(session, results) { // 重点:从session.message.value里拿Adaptive Card提交的数据 if (session.message.value) { var submitData = session.message.value; // 获取表单里的输入值 var searchContent = submitData.searchQuery; var actionType = submitData.action; if (actionType === "formSearchSubmit") { // 这里写你的后续流程逻辑,比如执行搜索 session.send(`收到你的搜索请求:${searchContent}`); // 结束当前dialog并返回结果给上一级流程 session.endDialogWithResult({ response: searchContent }); } } else { // 处理用户直接输入文本的情况 session.send("请使用表单中的「提交」按钮完成搜索操作"); } } ]);
2. 几个关键注意点
- 务必确认Adaptive Card的
$schema路径正确,是http://adaptivecards.io/schemas/adaptive-card.json,写错的话卡片可能无法正常渲染和提交 - 发送卡片时一定要用
builder.Message(session).addAttachment(card)包装,不能直接把card对象传给session.send() - 如果你的Bot是v4版本,逻辑会稍有不同,但核心还是要监听
Action.Submit的payload,从turnContext.Activity.Value中获取提交数据
按照这个方式修改后,Adaptive Card的提交就能正常触发后续流程,你也能拿到表单里的输入数据了。
内容的提问来源于stack exchange,提问作者user9463688
相关产品推荐
相关产品推荐

