Reputation: 647
I am creating a bot using Microsoft bot framework , the bot will be receiving orders for a restaurant , I want to know how can I handle multiple dialogs , like for example the customer makes the first order , then i want the bot to ask do you want something else? then the customer says yes/no , incase of yes to repeat the same dailog again with keeping the state of the first one , what I am seeing in the documentation now is only one conversation and one dialog.
Thanks a lot
Upvotes: 15
Views: 12656
Reputation: 684
The above answers are good but I noticed some of the links provided are no longer working. Here is how I managed to navigate among different dialogs
public MakeChoiceDialog() : base (nameof(MakeChoiceDialog))
{
AddDialog(new ChoicePrompt(nameof(ChoicePrompt)));
AddDialog(new LoginDialog());
AddDialog(new SignUpDialog());
AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
{
LoginStepAsync,
LoginSignUpStepAsync,
//Other Steps here
}));
InitialDialogId = nameof(WaterfallDialog);
}
The method call will be
private async Task<DialogTurnResult> LoginSignUpStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
string userChoice = ((FoundChoice)stepContext.Result).Value;
var msg = string.Empty;
switch (userChoice)//You can use if statement here
{
case "Login":
return await stepContext.BeginDialogAsync(nameof(LoginDialog), null, cancellationToken);
default:
return await stepContext.BeginDialogAsync(nameof(SignUpDialog), null, cancellationToken);
}
return await stepContext.EndDialogAsync(null, cancellationToken);
}
In the Startup.cs add the following
services.AddSingleton<LoginDialog>();
services.AddSingleton<SignUpDialog>();
Upvotes: 0
Reputation: 63
With version V4 of Microsoft Bot Framework, FormFlow needs to be replaced by Waterfall Dialog. Here we can use stepContext.Values (dictionary) to maintain state across waterfall steps and present user with choice prompt for Yes or No response and then repeat the waterfall dialog in case of Yes response else end the dialog in last waterfall step.
Add below waterfall in constructor of your base Component dialog and repeat the waterfall as per user choice.
WaterfallStep[] myWaterfallDialog = new WaterfallStep[]
{
this.waterfallStepToGetUserOrder,
.......
this.promptUserForChoiceStep,
this.EndDialogStep
}
AddDialog(new WaterfallDialog("mydialog", myWaterfallDialog);
Upvotes: 1
Reputation: 14787
To manage multiple dialogs you need to use the Dialog Chains. You can either manage the stack of dialogs explicitly (using Call/Done) or implicitly using the Chain fluent methods. Here is sample of how to use it.
If the set of things that the user can select are already predefined I would then recommend using FormFlow. The Pizza & Sandwich samples are good examples of how to handle orders with a predefined set of options.
Upvotes: 15