显示文字不会回显

时间:2019-04-11 07:30:26

标签: c# botframework

我正在使用标题,DisplayText,文本和值(v3 SDK)创建一个Messageback按钮。运行机器人时,标题已正确设置,单击按钮后未显示显示文本。

我设置了两张卡片动作。

CardAction yesBtn = new CardAction()
{
    Type = ActionTypes.MessageBack,
    Title = "Yes",
    DisplayText = "OK",
    Text = "Yes",
};


CardAction noBtn = new CardAction()
{
     Type = ActionTypes.MessageBack,
     Title = "No",
     DisplayText = "No",
     Text = "No",
};        

我找不到此问题的任何解决方案。 最相似的是: CardAction DisplayText doesn't seem to work 但没有答案。

Microsoft bot框架文件说

  

displayText
  可选的。执行该操作时,用户已回呼到聊天流中。该文本不会发送到您的机器人。

但是单击按钮后什么也没有发生。

我还尝试了imBack ActionType,结果是相同的。

我在bot模拟器和azure门户上对其进行了测试,两者均无法正常工作。

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 Connector.Conversations.ReplyToActivityAsync(reply);

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

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

同样,您不能指望此行为可以在不同渠道上得到一致实施。在这三个中,事实证明Facebook Messenger Platform仅具有PostBack类型,但实际上它的行为类似于MessageBack,它向用户显示文本以及向机器人发送替代文本。在英雄卡中,CardAction.Title将用作按钮的标签和对话历史记录中显示的文本,CardAction.Value将用作分配给传入活动的TextValue个属性。 CardAction.TextCardAction.DisplayText将被Facebook Messenger连接器忽略。

由于您只想在对话历史记录中显示文本,因此很幸运。实际上,使用哪种操作类型都没有关系。 Facebook连接器使用回发按钮自动将具有这三种操作类型中的任何一种的英雄卡转换为generic template。建议的操作将转换为Quick Replies,其行为略有不同,因为发送到您的漫游器的数据将采用不同的格式,但是您可以从中提取相同的信息。

如果您想直接将Facebook模板发送到Messenger,而不是依靠连接器来转换英雄卡,则可以使用channel data。您可以像这样在C#中构造模板:

object data = new
{
    attachment = new
    {
        type = "template",
        payload = new
        {
            template_type = "generic",
            elements = new[]
            {
                new
                {
                    title = "generic title",
                    subtitle = "generic subtitle",
                    image_url = "",
                    buttons = new[]
                    {
                        new
                        {
                            type = "postback",
                            title = "postback title",
                            payload = "postback payload"
                        }
                    }
                }
            }
        }
    }
};

由于某种原因,当您使用这样的匿名类型时,SDK不喜欢它,因此,在将其发送到Facebook之前,您需要将其转换为JObject

reply.ChannelData = JObject.FromObject(data);
await connector.Conversations.ReplyToActivityAsync(reply);