Есть несколько возможных обходных путей для вас.Обычно, если вы хотите учесть ситуации, когда пользователь хочет задать вопрос или сказать что-то, не связанное с формой, вы можете попросить его отменить форму, используя команду Quit .Если вы хотите, чтобы ваш бот был достаточно умным, чтобы интерпретировать, когда пользователи меняют тему в середине формы, это немного сложнее.
Если вы хотите продолжать использовать метод проверки, вы можете изменить свой MainOptionв поле string
вместо MainOptions?
, чтобы все пользовательские данные отправлялись в метод validate, но тогда вам нужно будет самостоятельно составить список вариантов выбора.
Я рекомендую использоватьпользовательский подсказчик вместо метода проверки.Я написал пост в блоге , в котором подробно рассказывается, как сделать такой суфлер.Сначала вы должны предоставить шаблон NotUnderstood , чтобы указать вашему подсказчику, когда сообщение недопустимо в FormFlow.Затем в подсказке вы вызываете диалоговое окно QnAMaker или делаете с сообщением все, что захотите.
// Define your NotUnderstood template
[Serializable, Template(TemplateUsage.NotUnderstood, NOT_UNDERSTOOD)]
public class MainReq
{
public const string NOT_UNDERSTOOD = "Not-understood message";
[Prompt("Indicare la tipologia della richiesta? {||}")]
public MainOptions? MainOption;
public static IForm<MainReq> BuildForm()
{
var form = (new FormBuilder<MainReq>()
.Prompter(PromptAsync) // Build your form with a custom prompter
.Build());
return form;
}
private static async Task<FormPrompt> PromptAsync(IDialogContext context, FormPrompt prompt, MainReq state, IField<MainReq> field)
{
var preamble = context.MakeMessage();
var promptMessage = context.MakeMessage();
if (prompt.GenerateMessages(preamble, promptMessage))
{
await context.PostAsync(preamble);
}
// Here is where we've made a change to the default prompter.
if (promptMessage.Text == NOT_UNDERSTOOD)
{
// Access the message the user typed with context.Activity
await context.PostAsync($"Do what you want with the message: {context.Activity.AsMessageActivity()?.Text}");
}
else
{
await context.PostAsync(promptMessage);
}
return prompt;
}
}