MsTeam herocard ActionTypes.ImBack的行为有所不同

时间:2019-06-06 07:12:16

标签: c# botframework microsoft-teams

我们用ActionTypes.ImBack创建了英雄卡

当我使用网络聊天和Facebook onclick时,它会在聊天窗口中显示card.title

例如向我显示菜单”

但是在团队中,它显示card.valus我不想向最终用户显示

例如“操作:IntentName”

我在MsTeams中尝试过回传,消息回传和调用,但两者都不起作用

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

预期输出:“显示菜单”

实际输出:“ Action:IntentName”

1 个答案:

答案 0 :(得分:0)

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

  

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

     

无论卡类型,操作类型或通道如何,这都是正确的。例如,虽然某些准则适用于卡片操作的属性,但您实际上不能依赖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作为活动的文本和呈现的消息。
  • PostBack MessageBack 使用title作为按钮标签,使用text作为活动的文本,使用displayText作为呈现的内容消息。

这意味着,如果您想在团队中使用英雄卡来发送包含未显示给用户的数据的消息,则需要使用 PostBack MessageBack 。您需要根据机器人正在通信的通道来不同地创建卡。您可以从活动的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;