选择卡片操作后,团队将 return 一个空字符串
Teams wil return a null string after a card action is selected
我将通过 2 个操作向用户发送一张自适应卡片,但是当我 select 一个操作时,将向服务器发送一个空字符串。因此,机器人无法理解用户想要什么。
作为额外的检查,我回显了用户发送给机器人的所有内容。存在空检查。
这是 Teams 中的对话:
这是模拟器中的对话:
这是我创建 activity:
的代码
Activity activity = new Activity()
{
Attachments = new List<Attachment>()
{
new Attachment()
{
ContentType = AdaptiveCard.ContentType,
Content = new AdaptiveCard("1.0")
{
Body = new List<AdaptiveElement>()
{
new AdaptiveTextBlock()
{
Text = $"Lorem reminder",
Size = AdaptiveTextSize.Large
},
new AdaptiveTextBlock()
{
Text = $"Hi {userName},\r\nYou've missed some lorem ipsum dolor sit amet:\r\n- **consectetur:** Ut porttitor\r\nChoose an action from below to add them."
}
},
Actions = new List<AdaptiveAction>()
{
CreateCardAction("First action"),
CreateCardAction("Second action")
}
}
}
},
From = turnContext.Activity.Recipient,
Recipient = turnContext.Activity.From,
Type = "message",
Conversation = turnContext.Activity.Conversation
};
private AdaptiveAction CreateCardAction(string text)
{
return new AdaptiveSubmitAction()
{
Title = text,
Data = text
};
}
对 AdaptiveSubmitAction
(如 ) 使用类型 imBack
在这里不起作用。请参阅下面模拟器的屏幕截图。
如果您 运行 在本地使用 NGrok,则值得在 ngrok 检查器中查看有效负载,以便您了解发回的内容 (http://localhost:4040/)。
本质上,"Data" 只是一个 "object" 类型,因此您可以在那里提交您想要的任何内容。例如,假设您希望它发回一个 "id" 值 - 简单地将其附加为 "Data" 属性,例如:
private AdaptiveAction CreateCardAction(string text, string id)
{
return new AdaptiveSubmitAction()
{
Title = text,
Data = id
};
}
或者,它可以是更复杂的对象,例如:
public class Foo {
public string something { get; set; }
public string id{ get; set; }
}
private AdaptiveAction CreateCardAction(string text, Foo foo)
{
return new AdaptiveSubmitAction()
{
Title = text,
Data = foo
};
}
然后当消息到达时,在您的 OnTurnAsync 上,您可以检查 Turncontext.Activity.Value 是否包含某些内容。
实际上,Teams 似乎剥离了纯字符串 "Data" 属性(在 DirectLine 通道上工作得很好)。
如果您能够用 JObject 替换纯字符串,问题就解决了。
如果 - 出于任何原因 - 你希望你的机器人充当 "bridge" 并转发到 Teams 频道,带有纯字符串的 AdaptiveCard "Data" 属性 来自不同的渠道(即 DirectLine),而不是将 "Data" 字符串内容包装在 JObject 中可以节省您的时间。
我将通过 2 个操作向用户发送一张自适应卡片,但是当我 select 一个操作时,将向服务器发送一个空字符串。因此,机器人无法理解用户想要什么。
作为额外的检查,我回显了用户发送给机器人的所有内容。存在空检查。
这是 Teams 中的对话:
这是模拟器中的对话:
这是我创建 activity:
的代码Activity activity = new Activity()
{
Attachments = new List<Attachment>()
{
new Attachment()
{
ContentType = AdaptiveCard.ContentType,
Content = new AdaptiveCard("1.0")
{
Body = new List<AdaptiveElement>()
{
new AdaptiveTextBlock()
{
Text = $"Lorem reminder",
Size = AdaptiveTextSize.Large
},
new AdaptiveTextBlock()
{
Text = $"Hi {userName},\r\nYou've missed some lorem ipsum dolor sit amet:\r\n- **consectetur:** Ut porttitor\r\nChoose an action from below to add them."
}
},
Actions = new List<AdaptiveAction>()
{
CreateCardAction("First action"),
CreateCardAction("Second action")
}
}
}
},
From = turnContext.Activity.Recipient,
Recipient = turnContext.Activity.From,
Type = "message",
Conversation = turnContext.Activity.Conversation
};
private AdaptiveAction CreateCardAction(string text)
{
return new AdaptiveSubmitAction()
{
Title = text,
Data = text
};
}
对 AdaptiveSubmitAction
(如 imBack
在这里不起作用。请参阅下面模拟器的屏幕截图。
如果您 运行 在本地使用 NGrok,则值得在 ngrok 检查器中查看有效负载,以便您了解发回的内容 (http://localhost:4040/)。
本质上,"Data" 只是一个 "object" 类型,因此您可以在那里提交您想要的任何内容。例如,假设您希望它发回一个 "id" 值 - 简单地将其附加为 "Data" 属性,例如:
private AdaptiveAction CreateCardAction(string text, string id)
{
return new AdaptiveSubmitAction()
{
Title = text,
Data = id
};
}
或者,它可以是更复杂的对象,例如:
public class Foo {
public string something { get; set; }
public string id{ get; set; }
}
private AdaptiveAction CreateCardAction(string text, Foo foo)
{
return new AdaptiveSubmitAction()
{
Title = text,
Data = foo
};
}
然后当消息到达时,在您的 OnTurnAsync 上,您可以检查 Turncontext.Activity.Value 是否包含某些内容。
实际上,Teams 似乎剥离了纯字符串 "Data" 属性(在 DirectLine 通道上工作得很好)。
如果您能够用 JObject 替换纯字符串,问题就解决了。
如果 - 出于任何原因 - 你希望你的机器人充当 "bridge" 并转发到 Teams 频道,带有纯字符串的 AdaptiveCard "Data" 属性 来自不同的渠道(即 DirectLine),而不是将 "Data" 字符串内容包装在 JObject 中可以节省您的时间。