【发布时间】:2021-06-08 08:14:22
【问题描述】:
我在使用 Teams Bot 自适应卡片操作提交时遇到问题,在测试 Bot Emulator 时它按预期工作,但是当它发布并在 Teams 对话中执行相同操作时,操作提交返回未定义。 我尝试过自适应卡 1.0 版和 1.3 版,两种情况下的问题都是一样的。 有谁知道这个的解决方案吗?
【问题讨论】:
标签: botframework microsoft-teams
我在使用 Teams Bot 自适应卡片操作提交时遇到问题,在测试 Bot Emulator 时它按预期工作,但是当它发布并在 Teams 对话中执行相同操作时,操作提交返回未定义。 我尝试过自适应卡 1.0 版和 1.3 版,两种情况下的问题都是一样的。 有谁知道这个的解决方案吗?
【问题讨论】:
标签: botframework microsoft-teams
另一个答案提供了一些有用的背景,但我认为它仅适用于特定场景 - 我认为您在这里遇到的问题是您在 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 可能会搞砸一些事情。
“标准”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();
}
如果您不使用助手来生成卡片,您可以在此处明确定义它们,但我确实建议使用助手来保持整洁。这确实意味着您需要维护两个版本的卡片,但对我来说,确保跨渠道的一致体验是值得的。
【讨论】: