我正在使用DialogPromptBot sample。在示例中,有以下代码:
// Create the dialog set and add the prompts, including custom validation.
_dialogSet = new DialogSet(_accessors.DialogStateAccessor);
_dialogSet.Add(new NumberPrompt<int>(PartySizePrompt, PartySizeValidatorAsync));
_dialogSet.Add(new ChoicePrompt(LocationPrompt));
_dialogSet.Add(new DateTimePrompt(ReservationDatePrompt, DateValidatorAsync));
// Define the steps of the waterfall dialog and add it to the set.
WaterfallStep[] steps = new WaterfallStep[]
{
PromptForPartySizeAsync,
PromptForLocationAsync,
PromptForReservationDateAsync,
AcknowledgeReservationAsync,
};
_dialogSet.Add(new WaterfallDialog(ReservationDialog, steps));
它设置一些提示,验证用户的输入并保存他们的响应。我不喜欢代码的工作方式,因为在下一步中保存了用户的输入(即,聚会的大小保存在位置提示中,而位置保存在日期提示中)。我想在相应的验证步骤中保存用户的输入。这将消除请求之间的纠缠,并允许我重新排序问题,而无需进行很多不必要的更改。这也将允许我对相同类型的问题使用相同的验证器。
如何从提示验证器访问
WaterfallStepContext
?一旦确定输入有效,这将允许我保存用户的输入。另外,ChoicePrompt
应该也带有提示验证器,但我似乎无法使它起作用。它似乎具有内置的验证功能,但我也想将用户的输入保存在那里。 最佳答案
验证提示值时,不建议存储任何状态。取而代之的是,提示的调用者有责任用该值做某事。具体来说,当使用WaterfallDialog
时,建议的模式是“下一个”步骤始终负责存储上一个步骤的结果。
因此,假设有一个数字提示可以确保选择一个介于1到100之间的值:
Add(new NumberPrompt<int>("myNumberPrompt", async (pvc, ct) => pvc.Succeeded && pvc.Recognized.Value > 1 && pvc.Recognized.Value < 100);
然后一些利用该提示的瀑布步骤:
private async Task<DialogTurnResult> FirstStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
return await stepContext.PromptAsync("myNumberPrompt", new PromptOptions { Prompt = MessageFactory.Text("Please pick a number between 1 and 100") }, cancellationToken);
}
private async Task<DialogTurnResult> SecondStep(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
// Get the result of the previous step which will be the value from the NumberPrompt<int>
var chosenNumber = (int)stepContext.Result;
// Store the value into the WaterfallStepContext's Values dictionary
stepContext.Values["ChosenNumber"] = chosenNumber;
await stepContext.Context.SendActivityAsync($"Ok, {chosenNumber}, got it.");
// ... more code here, maybe prompt for other values, whatever ...
}
关于c# - 如何从Microsoft Bot Framework中的PromptValidator获取stepContext?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54484033/