FluentValidator, как валидировать поле при условии, что другое поле уже прошло проверку?

Рейтинг: 0Ответов: 1Опубликовано: 16.05.2023

Допустим, что есть такая модель:

class Test
{
    public int Id { get; set; }
    public Guid Guid { get; set; }
}

Как можно провалидировать св-во Guid, если Id, например, есть в базе данных?

Что я пробовал и что получилось - проверка Id в базе, но как исходя из ответа на валидацию Id сделать валидацию для Guid? Т.е. если Id не прошел валидацию, то Guid не стоит валидировать вообще.

class TestValidator : AbstractValidator<Test>
{
    public TestValidator()
    {
        RuleFor(x => x.Id).MustAsync(CheckIdInDb);
    }

    private Task<bool> CheckIdInDb(int arg1, CancellationToken arg2)
    {
        //...check in db

        return Task.FromResult(true);
    }
}

When не сработает, там простой предикат, да и дважды ходить в базу не хотелось бы.

Ответы

▲ 1

Ответ случайно нашелся тут
Нужно использовать DependentRules, куда и положить проверку поля Guid.

RuleFor(x => x.Id).MustAsync(CheckIdInDb).DependentRules(() => RuleFor(x => x.Guid).NotEmpty());