Правило 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 и округ к руту, чтобы проверить. Каков наилучший метод для достижения этой цели?
Ответы
Ответ 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
, поэтому это имеет смысл.