Проверка шага диалогового окна бота C #

Привет, я реализую бота, использующего ядро ​​.net. Я использую диалог водопада для разговора. Дело в том, что между одним шагом и другим мне нужно проверить информацию, полученную с моей db. Я пытаюсь использовать проверки в параметрах подсказки, но у меня это не работает. Кто-нибудь может мне помочь. Вот мой код.

public class DetectProblemStep : ComponentDialog
{
    // Define a "done" response for the company selection prompt.
    private const string DoneOption = "done";

    // Define value names for values tracked inside the dialogs.
    private const string UserInfo = "value-userInfo";

    public DetectProblemStep()
        : base(nameof(DetectProblemStep))
    {
        AddDialog(new TextPrompt(nameof(TextPrompt)));
        AddDialog(new NumberPrompt<int>(nameof(NumberPrompt<int>)));

        AddDialog(new ReviewSelectionDialog());

        AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
        {
            NameStepAsync,
            EmailStepAsync
        }));

        InitialDialogId = nameof(WaterfallDialog);
    }

    private static async Task<DialogTurnResult> NameStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        // Create an object in which to collect the user's information within the dialog.
        stepContext.Values[UserInfo] = new UserProfile();

        var promptOptions = new PromptOptions { Prompt = MessageFactory.Text("Please enter your name."),
            Validations = nameof(NameValidation)
        };

        // Ask the user to enter their name.
        return await stepContext.PromptAsync(nameof(TextPrompt), promptOptions, cancellationToken);
    }

    private static async Task<DialogTurnResult> EmailStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
    {
        // Create an object in which to collect the user's information within the dialog.
        stepContext.Values[UserInfo] = new UserProfile();

        var promptOptions = new PromptOptions
        {
            Prompt = MessageFactory.Text("Please enter your Email."),
        };

        // Ask the user to enter their name.
        return await stepContext.PromptAsync(nameof(TextPrompt), promptOptions, cancellationToken);
    }



    public Task<bool> NameValidation(PromptValidatorContext<string> promptContext, CancellationToken cancellationToken)
    {

        return Task.FromResult(false);
    }


}

}


person Sebastian Herrera    schedule 30.01.2020    source источник
comment
Почему бы вам не сделать один из этапов водопада этапом проверки? Сделайте вызов своей БД с информацией из предыдущего шага в «начале» выбранного шага водопада, а затем отправьте в cx «Подтверждаю!» или «Подождите!», а затем переходите к следующему шагу.   -  person JJ_Wailes    schedule 04.02.2020


Ответы (1)


К сожалению, в документации об этом далеко не все ясно.

Validations-объект используется для передачи объектов вашей пользовательской функции проверки. Это полезно, когда вы хотите изменить проверку во время выполнения. То есть проверка зависит от информации, которой у вас нет при добавлении подсказки в DialogSet (что вы делаете в конструкторе).

Если ваша проверка может быть определена, когда ваше приглашение добавлено в DialogSet, вам просто нужно сделать:

AddDialog(new TextPrompt(nameof(TextPrompt), NameValidation));

Но если вы хотите добавить дополнительную проверку в приглашение при фактическом вызове PromptAsync (), вы можете передать вам все, что угодно, например:

private static async Task<DialogTurnResult> NameStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
{
    // Create an object in which to collect the user's information within the dialog.
    stepContext.Values[UserInfo] = new UserProfile();

    var validations = new AdditionalValidationOptions { MinLength = 3 };

    var promptOptions = new PromptOptions { Prompt = MessageFactory.Text("Please enter your name."),
        Validations = validations 
    };

    // Ask the user to enter their name.
    return await stepContext.PromptAsync(nameof(TextPrompt), promptOptions, cancellationToken);
}

public Task<bool> NameValidation(PromptValidatorContext<string> promptContext, CancellationToken cancellationToken)
{
    var validations = (AdditionalValidationOptions)promptContext.Options.Validations;

    return Task.FromResult(promptContext.Recognized.Value >= validations.MinLength);
}

и определить класс

public class AdditionalValidationOptions 
{
    public int MinLength {get; set;}
}
person Rufus1123    schedule 08.07.2020