我正在使用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/

10-11 22:02