[英]How do I handle Postback from AdaptiveCard in OnTurnAsync-Method
我正在编写一个使用自适应卡片ChoiceSet的机器人。 我试图让用户选择。 现在因为结果没有在聊天中显示,我必须检查OnTurnAsync
,如果我得到的消息是postback
。 我该怎么做呢? 这就是我试过的方法 - > if (dc.Context.Activity.GetType().GetProperty("ChannelData") != null)
Null ReferenceException
if (string.IsNullOrWhiteSpace(activity.Text) && activity.Value != null)
{
activity.Text = JsonConvert.SerializeObject(activity.Value);
}
我的OnTurnAsync-Method:
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
定义的DialogSet
。 有几种不同的方法可以做到这一点,但这是我用来测试你上一期的<myBot>.cs
类的上半部分:
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
类(注意他们没有从自适应卡片输入......这只是为了帮助你设置瀑布对话框和OnTurnAsync
):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.