如何在 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):

  1. MultiTurnPromptsBot
  2. CardsBot
  3. BasicBot