我有一个瀑布对话框,提示用户选择“是”或“否”。用户选择“是”后,该漫游器就不会继续进入下一个瀑布对话框。
瀑布的第一步。
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));
答案 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);
}
但是!!如果我将该行更改为Input.Confirm(提示类型仅限于“是”或“否”,而不是选项列表),则它会按预期工作:
return await stepContext.PromptAsync(
Inputs.Confirm,
new PromptOptions
让我知道您是否需要其他帮助!
答案 1 :(得分:1)
我不知道您是否已经找到解决方案,但是我遇到了同样的问题并找到了解决方案。 问题在于在OnTurnAsync方法的末尾,没有使用访问者的保存更改方法将DialogState保存在ConversationState中。这是必要的,并且下次在您的dialgogContext中将包含一个“ ActiveDialog”,即“ authDialog”。
///将更新的对话框状态保存到对话状态。 等待_accessors.ConversationState.SaveChangesAsync(turnContext,false,CancellationToken);
您可能还需要修改BotAccessors类以获取对ConversationState的引用。
请参阅下面的链接以供参考。