从Bot Framework v4中的当前步骤转到下一个Waterfall步骤

时间:2018-10-11 09:24:46

标签: c# authentication botframework

我有一个瀑布对话框,提示用户选择“是”或“否”。用户选择“是”后,该漫游器就不会继续进入下一个瀑布对话框。

瀑布的第一步。

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;
    }

我在这里想念什么?先感谢您。我遵循了this指南和this项目。

编辑:我在机器人的构造函数中设置了对话框,并在该对话框中添加了提示和瀑布对话框。

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

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

2 个答案:

答案 0 :(得分:1)

您好Nishan Chathuranga !!

我在创建确认机器人时遇到了这个问题!一个小小的改变将使您走上正确的道路。选择提示返回一个字符串,而不是布尔值,因此您感到困惑。但是,如果将其更改为“确认提示”,则将消除此问题。

在我的对话框集中,添加了多种提示类型:

// 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来选择需要yes(true)或no(false)答案的东西,它就会崩溃:

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

让我知道您是否需要其他帮助!

答案 1 :(得分:1)

我不知道您是否已经找到解决方案,但是我遇到了同样的问题并找到了解决方案。 问题在于在OnTurnAsync方法的末尾,没有使用访问者的保存更改方法将DialogState保存在ConversationState中。这是必要的,并且下次在您的dialgogContext中将包含一个“ ActiveDialog”,即“ authDialog”。

///将更新的对话框状态保存到对话状态。 等待_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