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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:16:47