我正在使用标题,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门户上对其进行了测试,两者均无法正常工作。
答案 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)具有一些与之相关的预期行为:
同样,您不能指望此行为可以在不同渠道上得到一致实施。在这三个中,事实证明Facebook Messenger Platform仅具有PostBack类型,但实际上它的行为类似于MessageBack,它向用户显示文本以及向机器人发送替代文本。在英雄卡中,CardAction.Title
将用作按钮的标签和对话历史记录中显示的文本,CardAction.Value
将用作分配给传入活动的Text
和Value
个属性。 CardAction.Text
和CardAction.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);