Как мне обработать обратную передачу от AdaptiveCard в OnTurnAsync-Method - PullRequest
0 голосов
/ 21 февраля 2019

Я программирую бота, который использует адаптивные карты ChoiceSet.Я пытаюсь получить выбор пользователей.Теперь, поскольку результат не отображается в чате, я должен проверить метод 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;

1 Ответ

0 голосов
/ 21 февраля 2019

Это из-за вашей строки: 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 (string.IsNullOrWhiteSpace(activity.Text))
            {
                activity.Text = JsonConvert.SerializeObject(activity.Value);
            }
    [...]

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

  1. MultiTurnPromptsBot
  2. CardsBot
  3. BasicBot
...