c# - 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”
解决方案
我链接的答案中的重要信息
卡行为本质上是特定于通道的。
无论卡牌类型、行动类型或渠道如何,这都是全面的。虽然某些准则适用于卡片操作的属性,但您真的不能依赖于像
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
呈现的消息。
这意味着,如果您想让 Teams 中的英雄卡发送包含未向用户显示的数据的消息,则需要使用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;
推荐阅读
- javascript - 使用 LOOPS 从字符串创建各种数组
- c# - 如何为 UWP 包安装程序添加 Microsoft.NET.CoreRuntime.2.1?
- c# - MassTransit 自定义消息类型名称
- python - 是否有一种矢量化方式来访问另一列中明确指示的列值?
- python - 我想使用 python 代码更新特定 xml 标记的值?
- javascript - Flask-SocketIO 握手失败
- haproxy - HAPROXY 外部健康检查不起作用
- symfony - 如何在 Symfony4 中从 db 授权自定义用户
- r - 只保留连续季度的观察结果
- javascript - `this`在类方法内的匿名函数内未定义