Перейти к следующему шагу водопада от текущего шага в рамках бота v4 - PullRequest
0 голосов
/ 11 октября 2018

У меня есть диалоговое окно с водопадом, которое предлагает пользователю выбрать «Да» или «Нет».После выбора пользователем «Да» бот не переходит к следующему диалоговому окну водопада.

Первый шаг водопада.

private static async Task<DialogTurnResult> LoginStepAsync(WaterfallStepContext step, CancellationToken cancellationToken)
    {
        var tokenResponse = (TokenResponse)step.Result;
        if (tokenResponse != null)
        {
            await step.Context.SendActivityAsync("You are now logged in.", cancellationToken: cancellationToken);
            return await step.PromptAsync(
                ConfirmPromptName,
                new PromptOptions
                {
                    Prompt = MessageFactory.Text($"Would you like to view your token? {tokenResponse.Token}"),
                    Choices = new List<Choice> { new Choice("Yes"), new Choice("No") },
                },
                cancellationToken);
        }

        await step.Context.SendActivityAsync("Login was not successful please try again.", cancellationToken: cancellationToken);
        return Dialog.EndOfTurn;
    }

Второй шаг водопада.

    private static async Task<DialogTurnResult> DisplayTokenAsync(WaterfallStepContext step, CancellationToken cancellationToken)
    {
        var result = (bool)step.Result;
        if (result)
        {
            var prompt = await step.BeginDialogAsync(LoginPromptName, cancellationToken: cancellationToken);
            var tokenResponse = (TokenResponse)prompt.Result;
            if (tokenResponse != null)
            {
                await step.Context.SendActivityAsync($"Here is your token {tokenResponse.Token}", cancellationToken: cancellationToken);
            }
        }

        return Dialog.EndOfTurn;
    }

Что мне здесь не хватает?Заранее спасибо.Я следовал этому руководству и этому проекту.

Редактировать: У меня есть диалоговое окно, установленное в конструкторе бота, добавлены подсказки и водопаддиалог к ​​набору.

    var waterfallSteps = new WaterfallStep[]
    {
        PromptStepAsync,
        LoginStepAsync,
        DisplayTokenAsync,
    };

    _dialogs.Add(new WaterfallDialog("authDialog", waterfallSteps));

Ответы [ 2 ]

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

Я не знаю, нашли ли вы решение для этого уже, но я столкнулся с той же проблемой и нашел решение.Проблема заключается в том, что не сохраняется DialogState в ConversationState с использованием метода доступа сохранить изменения в конце метода OnTurnAsync.Это необходимо, и в следующий раз ваш dialgogContext будет содержать «ActiveDialog», который является вашим «authDialog».

// Сохранить обновленное состояние диалога в состояние диалога.await _accessors.ConversationState.SaveChangesAsync (turnContext, false, cancellationToken);

Вам также может понадобиться изменить класс BotAccessors, чтобы получить ссылку на ConversationState.

см. Ссылку ниже для справки.

https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-prompts?view=azure-bot-service-4.0&tabs=csharp

0 голосов
/ 18 октября 2018

Привет, Нишан Чатуранга !!

Я столкнулся с этой проблемой, когда создавал бота для подтверждения!Одно небольшое изменение приведет вас на правильный путь.Запрос выбора возвращает строку, а не логическое значение, так что вы путаете ее.Но если вы измените его на Подтверждение приглашения, вы устраните эту проблему.

В свой набор диалогов я добавил несколько типов приглашения:

// Add the prompts.
            Add(new ChoicePrompt(Inputs.Choice));
            Add(new NumberPrompt<int>(Inputs.Number));
            Add(new ConfirmPrompt(Inputs.Confirm));

И мой список входов:

private static class Inputs //aka types of prompts
    {
        public const string Choice = "choicePrompt";
        public const string Number = "numberPrompt";
        public const string Confirm = "confirmPrompt";
    }

Теперь, когда я вызывал эти приглашения, если я вызывал Inputs.Choice для чего-то, что требовало ответа да (истина) или нет (ложь), он ломался:

public static async Task<DialogTurnResult> ConfirmPhoneAsync(
            WaterfallStepContext stepContext,
            CancellationToken cancellationToken)
        {
            var phoneNumber = stepContext.Context.Activity.Text;
            stepContext.Values[Outputs.PhoneNumber] = phoneNumber;

            return await stepContext.PromptAsync(
                Inputs.Choice,
                new PromptOptions
                {
                    Prompt = MessageFactory.Text($"Is {phoneNumber} your phone number?"),
                    Choices = new List<Choice> { new Choice("yep"), new Choice("nah.") },
                },
                cancellationToken);
        }

wrongChoice

НО !!Если я изменил эту строку на Input.Confirm (тип приглашения, ограниченный «да» или «нет», а не список параметров), он работал бы так, как ожидалось:

return await stepContext.PromptAsync(
                Inputs.Confirm,
                new PromptOptions

rightChoice

Дайте мне знать, если вам нужна другая помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...