Как мне обработать обратную передачу от AdaptiveCard в OnTurnAsync-Method

Я программирую бота, который использует адаптивные карты ChoiceSet. Я пытаюсь получить выбор пользователей. Теперь, поскольку результат не отображается в чате, я должен проверить в OnTurnAsync-Метод, если полученное сообщение postback, Как мне это сделать? Вот как я пытался -> Null ReferenceException в if (dc.Context.Activity.GetType().GetProperty("ChannelData") != null)

Мой 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;

1 ответ

Решение

Это из-за вашей линии: DialogContext dc = null,

Так должно быть: var dc = await Dialogs.CreateContextAsync(turnContext);

Обратите внимание, что Dialogs может потребоваться заменить на то, что вы определили 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 (activity.Type == ActivityTypes.Message)
            {
                // Ensure that message is a postBack (like a submission from Adaptive Cards
                var channelData = JObject.Parse(dc.Context.Activity.ChannelData.ToString());
                if (channelData.ContainsKey("postback"))
                {
                    var postbackActivity = dc.Context.Activity;
                    // Convert the user's Adaptive Card input into the input of a Text Prompt
                    // Must be sent as a string
                    postbackActivity.Text = postbackActivity.Value.ToString();
                    await dc.Context.SendActivityAsync(postbackActivity);
                }
            }
            ...

Вот несколько ссылок на несколько хороших примеров, которые также используют диалоги водопада, так что вы можете увидеть, как они настраивают свои <bot>.cs класс (обратите внимание, что они не получают вход от адаптивных карт... это просто, чтобы помочь вам настроить диалог водопад и OnTurnAsync):

  1. MultiTurnPromptsBot
  2. CardsBot
  3. BasicBot
Другие вопросы по тегам