Botframework 团队机器人自适应卡操作。提交返回未定义但在机器人模拟器中工作

Botframework 团队机器人自适应卡操作。提交返回未定义但在机器人模拟器中工作,botframework,microsoft-teams,Botframework,Microsoft Teams,我对Teams Bot adaptive card action submit有一个问题,当测试Bot Emulator时,它按预期工作,但是当它发布并在Teams对话中执行相同的操作时,action submit返回未定义。 我尝试过使用自适应卡1.0版和1.3版,但在这两种情况下问题都是一样的。 有人知道这方面的解决方案吗?标准操作。提交在团队中不起作用。您需要在数据属性下添加一个msteams对象。我猜你使用的是一个标准定义,比如 { 类型:ActionSet, 行动:[ { 类型:Act

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

标准操作。提交在团队中不起作用。您需要在数据属性下添加一个msteams对象。我猜你使用的是一个标准定义,比如

{ 类型:ActionSet, 行动:[ { 类型:Action.Submit, 标题:我的行动, 数据:我的行动 } ] } 对于团队,它需要如下所示:

{ 类型:ActionSet, 行动:[ { 类型:Action.Submit, 标题:我的行动, 数据:{ MSF团队:{ 类型:imBack, 价值:我的行动 } } } ] } 当然,当您这样做时,它在emulator或任何非团队通道中都不起作用。我见过一些人通过提取值来更新他们的onMessage处理程序,从而解释这一点,这样一张卡的定义可以对两个频道都有效,但它使选择成为其中一个频道的一个反向频道事件,我记不起它是web还是团队,这不是我想要的体验。因此,我只是根据通道有条件地显示一张团队卡或非团队卡。例如:

如果context.activity.channelId=='msteams'{ var welcomeCard=cardheloper.GetMenuCardTeams; }否则{ var welcomeCard=CardHelper.GetMenuCard; }
如果你不使用助手来生成你的卡片,你可以在这里明确地定义它们,尽管我建议使用助手来保持整洁。这确实意味着您需要维护两个版本的卡,但对我来说,确保跨渠道的一致体验是值得的。

标准操作。提交在团队中不起作用。您需要在数据属性下添加一个msteams对象。我猜你使用的是一个标准定义,比如

{ 类型:ActionSet, 行动:[ { 类型:Action.Submit, 标题:我的行动, 数据:我的行动 } ] } 对于团队,它需要如下所示:

{ 类型:ActionSet, 行动:[ { 类型:Action.Submit, 标题:我的行动, 数据:{ MSF团队:{ 类型:imBack, 价值:我的行动 } } } ] } 当然,当您这样做时,它在emulator或任何非团队通道中都不起作用。我见过一些人通过提取值来更新他们的onMessage处理程序,从而解释这一点,这样一张卡的定义可以对两个频道都有效,但它使选择成为其中一个频道的一个反向频道事件,我记不起它是web还是团队,这不是我想要的体验。因此,我只是根据通道有条件地显示一张团队卡或非团队卡。例如:

如果context.activity.channelId=='msteams'{ var welcomeCard=cardheloper.GetMenuCardTeams; }否则{ var welcomeCard=CardHelper.GetMenuCard; }
如果你不使用助手来生成你的卡片,你可以在这里明确地定义它们,尽管我建议使用助手来保持整洁。这确实意味着您需要维护两个版本的卡,但对我来说,确保跨渠道的一致体验是值得的。

另一个答案提供了一些有用的背景,但我认为它只适用于特定场景-我认为这里的问题是,您在数据属性My Action中发送了一个原始字符串值,团队不喜欢,但emulator根本不介意。您可以查看中描述的更多信息。您应该发送一个实际的对象。我在回答中对此进行了更详细的描述:


@billoverton所指的是一个特定的用例,您希望按钮的行为是,例如,将消息作为响应放入文本流,并将其发送给您的机器人。如前所述,这些特定用例有各种选项,但如果您想要这种特定行为,它们是可选的。如果您希望用户单击按钮,并且只需将消息调用到您的bot,则不需要数据有效负载中的msteams部分。

另一个答案提供了一些有用的背景信息,但我认为它只适用于特定场景-我认为这里的问题是,您在数据属性My Action中发送了一个原始字符串值,团队不喜欢,但emulator根本不介意。您可以查看中描述的更多信息。您应该发送一个实际的对象。我用m来描述它 此答案中的详细信息:


@billoverton所指的是一个特定的用例,您希望按钮的行为是,例如,将消息作为响应放入文本流,并将其发送给您的机器人。如前所述,这些特定用例有各种选项,但如果您想要这种特定行为,它们是可选的。如果您很高兴用户单击按钮,并且只需将消息调用到您的bot,那么您就不需要数据负载中的msteams部分。

谢谢billoverton,您是一个宝藏!也许你也能帮我解决另一个问题?我在登录时遇到一些问题,我正在使用Oauth provider让用户使用其Auth0用户登录。流程可以工作,但并不一致。示例:用户输入登录命令,启动流程并弹出卡片进行登录。用户单击“登录”,将弹出一张新的登录卡。用户再次单击登录,将弹出一张新的登录卡。用户单击“登录”,这一次显示您现在已登录,但用户未成功登录。在一些进一步的强制登录之后,它工作了。我没有使用Oauth,所以我不认为我能帮上忙,但不管怎样,你最好还是把这个作为一个单独的问题发布。谢谢你billoverton,你是一个宝藏!也许你也能帮我解决另一个问题?我在登录时遇到一些问题,我正在使用Oauth provider让用户使用其Auth0用户登录。流程可以工作,但并不一致。示例:用户输入登录命令,启动流程并弹出卡片进行登录。用户单击“登录”,将弹出一张新的登录卡。用户再次单击登录,将弹出一张新的登录卡。用户单击“登录”,这一次显示您现在已登录,但用户未成功登录。在一些进一步的强制登录之后,它工作了。我没有使用Oauth,所以我认为我帮不了什么忙,但不管怎样,你最好还是把这作为一个单独的问题发布。谢谢你提供的附加上下文。我要注意的一点是,如果您使用的是自动处理活动的任何中间件,那么在您可以在onMessage处理程序中手动设置context.activity.text之前,就会发生这种情况。例如,如果我这样做,我的成绩单中间件将不会有文本值。我同意这是一个特定的用例,但是如果没有或无法处理空活动。文本可能会把一些事情搞砸。感谢提供额外的上下文。我要注意的一点是,如果您使用的是自动处理活动的任何中间件,那么在您可以在onMessage处理程序中手动设置context.activity.text之前,就会发生这种情况。例如,如果我这样做,我的成绩单中间件将不会有文本值。我同意这是一个特定的用例,但是如果没有或无法处理空activity.text,它可能会把一些事情搞砸。