如何在 OnTurnAsync 方法中处理来自 AdaptiveCard 的回发
How do I handle Postback from AdaptiveCard in OnTurnAsync-Method
我正在编写一个使用自适应卡片选择集的机器人。我试图让用户选择。现在因为结果没有显示在聊天中,我必须检查 OnTurnAsync
-方法,如果我收到的消息是 postback
。
我该怎么做呢?
这就是我尝试的方式 -> Null ReferenceException 在
if (dc.Context.Activity.GetType().GetProperty("ChannelData") != null)
从 Botframework 支持编辑:请不要使用下面的代码块。它仅适用于模拟器。相反,使用:
if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
{
activity.Text = JsonConvert.SerializeObject(activity.Value);
}
我的 OnTurnAsync 方法:
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
DialogContext dc = null;
switch (turnContext.Activity.Type)
{
case ActivityTypes.Message:
if (dc.Context.Activity.GetType().GetProperty("ChannelData") != null)
{
var channelData = JObject.Parse(dc.Context.Activity.ChannelData.ToString());
if (channelData.ContainsKey("postback"))
{
var postbackActivit = dc.Context.Activity;
postbackActivit.Text = postbackActivit.Value.ToString();
await dc.Context.SendActivityAsync(postbackActivit);
}
}
await ProcessInputAsync(turnContext, cancellationToken);
break;
因为你的台词:DialogContext dc = null
.
应该是:var dc = await Dialogs.CreateContextAsync(turnContext);
请注意,Dialogs
可能需要替换为您定义 DialogSet
的内容。有几种不同的方法可以做到这一点,但这是我用来测试你上一期的 <myBot>.cs
class 的上半部分:
public class QuickTestBot_CSharpBot : IBot
{
private readonly IStatePropertyAccessor<DialogState> _dialogStateAccessor;
private readonly ConversationState _conversationState;
public QuickTestBot_CSharpBot(ConversationState conversationState)
{
_conversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));
_dialogStateAccessor = _conversationState.CreateProperty<DialogState>(nameof(DialogState));
Dialogs = new DialogSet(_dialogStateAccessor);
Dialogs.Add(new QuickDialog());
}
private DialogSet Dialogs { get; set; }
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
var activity = turnContext.Activity;
var dc = await Dialogs.CreateContextAsync(turnContext);
if (string.IsNullOrWhiteSpace(activity.Text))
{
activity.Text = JsonConvert.SerializeObject(activity.Value);
}
[...]
这里有一些指向也使用瀑布对话框的好示例的链接,因此您可以了解它们如何设置 <bot>.cs
class(请注意它们不会从自适应卡片获得输入...这只是为了帮助您设置瀑布对话框和 OnTurnAsync
):
我正在编写一个使用自适应卡片选择集的机器人。我试图让用户选择。现在因为结果没有显示在聊天中,我必须检查 OnTurnAsync
-方法,如果我收到的消息是 postback
。
我该怎么做呢?
这就是我尝试的方式 -> Null ReferenceException 在
if (dc.Context.Activity.GetType().GetProperty("ChannelData") != null)
从 Botframework 支持编辑:请不要使用下面的代码块。它仅适用于模拟器。相反,使用:
if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
{
activity.Text = JsonConvert.SerializeObject(activity.Value);
}
我的 OnTurnAsync 方法:
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
DialogContext dc = null;
switch (turnContext.Activity.Type)
{
case ActivityTypes.Message:
if (dc.Context.Activity.GetType().GetProperty("ChannelData") != null)
{
var channelData = JObject.Parse(dc.Context.Activity.ChannelData.ToString());
if (channelData.ContainsKey("postback"))
{
var postbackActivit = dc.Context.Activity;
postbackActivit.Text = postbackActivit.Value.ToString();
await dc.Context.SendActivityAsync(postbackActivit);
}
}
await ProcessInputAsync(turnContext, cancellationToken);
break;
因为你的台词:DialogContext dc = null
.
应该是:var dc = await Dialogs.CreateContextAsync(turnContext);
请注意,Dialogs
可能需要替换为您定义 DialogSet
的内容。有几种不同的方法可以做到这一点,但这是我用来测试你上一期的 <myBot>.cs
class 的上半部分:
public class QuickTestBot_CSharpBot : IBot
{
private readonly IStatePropertyAccessor<DialogState> _dialogStateAccessor;
private readonly ConversationState _conversationState;
public QuickTestBot_CSharpBot(ConversationState conversationState)
{
_conversationState = conversationState ?? throw new ArgumentNullException(nameof(conversationState));
_dialogStateAccessor = _conversationState.CreateProperty<DialogState>(nameof(DialogState));
Dialogs = new DialogSet(_dialogStateAccessor);
Dialogs.Add(new QuickDialog());
}
private DialogSet Dialogs { get; set; }
public async Task OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken = default(CancellationToken))
{
var activity = turnContext.Activity;
var dc = await Dialogs.CreateContextAsync(turnContext);
if (string.IsNullOrWhiteSpace(activity.Text))
{
activity.Text = JsonConvert.SerializeObject(activity.Value);
}
[...]
这里有一些指向也使用瀑布对话框的好示例的链接,因此您可以了解它们如何设置 <bot>.cs
class(请注意它们不会从自适应卡片获得输入...这只是为了帮助您设置瀑布对话框和 OnTurnAsync
):