首页 > 解决方案 > MsTeam herocard ActionTypes.ImBack 表现不同

问题描述

我们用 ActionTypes.ImBack 创建了 herocard

当我使用 webchat 和 facebook onclick 按钮时,它会在聊天窗口中显示 card.title

例如显示菜单”

但在团队中,它显示我不想向最终用户展示的 card.values

例如“动作:意图名称”

我在 MsTeams 中尝试过回发、回消息和调用,但都没有工作

plButton1 = new CardAction()
{
Value ="Action:IntentName",
Type = ActionTypes.ImBack,
Title = "Show me menu"
};

预期输出:“显示菜单”

实际输出:“Action:IntentName”

标签: c#botframeworkmicrosoft-teams

解决方案


我链接的答案中的重要信息

卡行为本质上是特定于通道的。

无论卡牌类型、行动类型或渠道如何,这都是全面的。虽然某些准则适用于卡片操作的属性,但您真的不能依赖于像displayText您期望的那样行为的属性。您需要自己测试该卡。这里有一些代码可以帮助您测试各种卡片操作类型和属性:

var actionTypes = new List<string>
{
    ActionTypes.ImBack,
    ActionTypes.PostBack,
    ActionTypes.MessageBack,
};

var cardActions = actionTypes.Select(actionType => new CardAction(
    actionType,
    $"{actionType} title",
    null,
    $"{actionType} value",
    $"{actionType} text",
    $"{actionType} displayText"
)).ToList();

var reply = activity.CreateReply("Reply:");

reply.Attachments = new List<Attachment> { new Attachment(HeroCard.ContentType, content: new HeroCard("Hero title", "Hero subtitle", "Hero text", buttons: cardActions)) };
reply.SuggestedActions = new SuggestedActions(new List<string> { activity.From.Id }, cardActions);

await turnContext.SendActivityAsync(reply);

这三种操作类型(ImBack、PostBack 和 MessageBack)具有一些与之相关的预期行为:

  • ImBack 旨在在对话历史记录中显示一条消息,就像用户键入它一样
  • PostBack 旨在向机器人发送隐藏元数据的不可见消息
  • MessageBack 旨在向机器人发送一条消息,该消息显示在对话历史记录中包含隐藏的元数据,结合了其他两种类型

同样,您不能指望这种行为在不同的渠道中得到一致的实施。

与您的问题特别相关的其他信息

如果您使用该 C# 代码进行试验,您可以确定 Microsoft Teams 会这样处理卡片操作:

  • ImBack用作title按钮标签,value用作活动的文本和呈现的消息。
  • PostBackMessageBack用作title按钮标签、text活动文本和displayText呈现的消息。

这意味着,如果您想让 Teams 中的英雄卡发送包含未向用户显示的数据的消息,则需要使用PostBackMessageBack。您需要根据机器人正在通信的渠道以不同的方式创建卡片。您可以从活动的ChannelId属性中确定通道:

switch (turnContext.Activity.ChannelId)
{
    case Channels.Msteams:
        action = new CardAction()
        {
            Type = ActionTypes.PostBack,
            Title = "Show me menu",
            Text = "Action:IntentName",
            DisplayText = "Show me menu",
        };

        break;
    default:
        action = new CardAction()
        {
            Type = ActionTypes.PostBack,
            Title = "Show me menu",
            Value = "Action:IntentName",
        };

        break;
}

幸运的是,在您的所有三个频道中,您希望从按钮接收的信息都将位于活动的Text属性中,因此在响应卡片操作生成的活动时,您不需要另一个 switch 语句:

var result = turnContext.Activity.Text;

推荐阅读