Есть несколько разных способов сделать это, в зависимости от того, как я интерпретирую ваш вопрос.
Самое простое - просто добавить отдельный RetryPrompt
. Например, если мы хотим сделать это для Multi-Turn-Prompt
семпла , мы просто добавим свойство RetryPrompt
:
private static async Task<DialogTurnResult> TransportStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
// WaterfallStep always finishes with the end of the Waterfall or with another dialog; here it is a Prompt Dialog.
// Running a prompt here means the next WaterfallStep will be run when the users response is received.
return await stepContext.PromptAsync(nameof(ChoicePrompt),
new PromptOptions
{
Prompt = MessageFactory.Text("Please enter your mode of transport."),
Choices = ChoiceFactory.ToChoices(new List<string> { "Car", "Bus", "Bicycle" }),
RetryPrompt = MessageFactory.Text("That wasn't a valid option. Try again.")
}, cancellationToken);
}
Это приведет к:
Другой альтернативой будет сделать что-то вроде того, что сказал @ pkr2000 (хотя и немного по-другому), и использовать специальный валидатор для динамического добавления RetryPrompt
. Что-то вроде:
AddDialog(new ChoicePrompt(nameof(ChoicePrompt), ValidateChoicesAsync));
[...]
private static Task<bool> ValidateChoicesAsync(PromptValidatorContext<FoundChoice> promptContext, CancellationToken cancellationToken)
{
if (!promptContext.Recognized.Succeeded)
{
promptContext.Options.RetryPrompt = MessageFactory.Text($"You said \"{ promptContext.Context.Activity.Text},\" which is invalid. Please try again.");
return Task.FromResult(false);
}
return Task.FromResult(true);
}
Это приводит к:
Вы можете делать все что угодно в валидаторе. Вместо использования MessageFactory.Text()
вы можете передать совершенно другой Activity
, например, адаптивную карту или что-то в этом роде. Вы также не могли бы установить RetryPrompt
, вместо этого изменив Prompt
на любой текст / действие, которое вы хотите, вернуть false
, и тогда пользователю будет предложено новое приглашение. Это действительно довольно безгранично, что вы можете сделать с помощью специального валидатора.