【问题标题】:Teams Bot Adaptive Card action.Submit returns undefined but works in Bot EmulatorTeams Bot Adaptive Card action.Submit 返回 undefined 但在 Bot Emulator 中工作
【发布时间】:2021-06-08 08:14:22
【问题描述】:

我在使用 Teams Bot 自适应卡片操作提交时遇到问题,在测试 Bot Emulator 时它按预期工作,但是当它发布并在 Teams 对话中执行相同操作时,操作提交返回未定义。 我尝试过自适应卡 1.0 版和 1.3 版,两种情况下的问题都是一样的。 有谁知道这个的解决方案吗?

【问题讨论】:

    标签: botframework microsoft-teams


    【解决方案1】:

    另一个答案提供了一些有用的背景,但我认为它仅适用于特定场景 - 我认为您在这里遇到的问题是您在 data 属性中发送原始字符串值(“我的操作") Teams 不喜欢,但模拟器根本不介意。您可以在this Microsoft blog post 中看到更多关于该内容的信息。相反,您应该发送一个实际对象。我在这个答案中更详细地描述了它:QnA Maker Bot AdaptiveCards: how to add Data object in C#

    @billoverton 指的是一个特定的用例,您希望按钮行为是,例如,实际上将消息作为响应放入文本流中,以及发送它到你的机器人。这些特定用例有多种选择,如here 所述,但如果您想要这种特定行为,它们是可选的。如果您乐于让用户单击按钮并简单地将消息调用到您的机器人,则不需要数据负载中的“msteams”部分。

    【讨论】:

    • 感谢您提供额外的上下文。我要注意的一件事是,如果您正在使用任何自动处理活动的中间件,那么在您可以在 onMessage 处理程序中手动设置 context.activity.text 之前就会发生这种情况。例如,如果我这样做,我的成绩单中间件将没有文本值。我同意这是一个特定的用例,但是如果您不处理或无法处理它,则使用 null activity.text 可能会搞砸一些事情。
    【解决方案2】:

    “标准”action.submit 在 Teams 中不起作用。您需要在 data 属性下添加一个 msteams 对象。我猜你正在使用像

    这样的标准定义
    {
        "type": "ActionSet",
        "actions": [
            {
                "type": "Action.Submit",
                "title": "My Action",
                "data": "My Action"
            }
        ]
    }
    

    对于 Teams,它需要如下所示:

    {
        "type": "ActionSet",
        "actions": [
            {
                "type": "Action.Submit",
                "title": "My Action",
                "data": {
                    "msteams": {
                        "type": "imBack",
                        "value": "My Action"
                    }
                }
            }
        ]
    }
    

    当然,当您这样做时,它在模拟器或任何非团队频道中都不起作用。我已经看到有些人通过提取值来更新他们的 onMessage 处理程序来解决这个问题,因此单个卡定义可以用于两个通道,但是它使选择成为其中一个通道的反向通道事件(不记得它是否是web 或 Teams),这不是我想要的体验。因此,我只是根据频道有条件地显示 Teams 或非 Teams 卡片。例如:

    if (context.activity.channelId == 'msteams') {
        var welcomeCard = CardHelper.GetMenuCardTeams();
    } else {
        var welcomeCard = CardHelper.GetMenuCard();
    }
    

    如果您不使用助手来生成卡片,您可以在此处明确定义它们,但我确实建议使用助手来保持整洁。这确实意味着您需要维护两个版本的卡片,但对我来说,确保跨渠道的一致体验是值得的。

    【讨论】:

    • 谢谢比洛弗顿,你是宝!
    • 也许您也可以帮助我解决不同的问题?我在登录时遇到了一些问题,我正在使用 Oauth 提供程序让用户使用他们的 Auth0 用户登录。流程有效,但并非始终如一。示例:用户输入“登录”命令,这将启动流程并弹出“登录”卡。用户点击“登录”,弹出一个新的“登录”卡片。用户再次点击登录,弹出一个新的“登录”卡片。用户点击登录,这次得到“您现在已登录”,但用户未成功登录。进一步强制登录后,它可以工作。
    • 我没有使用 Oauth,所以我认为我无能为力,但不管你最好的选择是将其作为一个单独的问题发布。
    猜你喜欢
    • 2021-01-08
    • 2021-11-17
    • 2021-02-19
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多