Подтвердить что ты не робот

Правило FluentValidation для нескольких свойств

У меня есть FluentValidator, который имеет несколько свойств, таких как zip, county и т.д. Я хочу создать правило, которое принимает два свойства, так же как конструкция RuleFor

public class FooArgs
{
    public string Zip { get; set; }
    public System.Guid CountyId { get; set; }
}

public class FooValidator : AbstractValidator<FooArgs>
{
    RuleFor(m => m.CountyId).Must(ValidZipCounty).WithMessage("wrong Zip County");
}

Это работает, но я хочу передать и Zip и округ к руту, чтобы проверить. Каков наилучший метод для достижения этой цели?

4b9b3361

Ответ 1

Существует перегрузка Must которая также предоставляет вам объект FooArgs описанный здесь. Это позволяет вам легко передавать оба аргумента в ваш метод следующим образом:

RuleFor(m => m.CountyId).Must((fooArgs, countyId) =>
    ValidZipCounty(fooArgs.Zip, countyId))
    .WithMessage("wrong Zip County");

Ответ 2

Просто наткнулся на этот старый вопрос, и я думаю, что у меня более простой ответ. Вы можете легко передать весь свой объект в свое собственное правило проверки, упростив параметр до RuleFor например.

RuleFor(m => m).Must(fooArgs =>
    ValidZipCounty(fooArgs.Zip, fooArgs.countyId))
    .WithMessage("wrong Zip County");

Если метод ValidZipCountry является локальным для вашего валидатора, и вы можете изменить его подпись, чтобы взять FooArgs, тогда код упростится до

RuleFor(m => m).Must(ValidZipCounty).WithMessage("wrong Zip County");

Единственным недостатком является то, что PropertyName в результирующей ошибке проверки будет пустой строкой. Это может вызвать проблему для кода проверки валидации. Однако не совсем ясно, какое свойство принадлежит ошибке, ContryId или Zip, поэтому это имеет смысл.