2013-12-11 3 views
13

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

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

+0

Возможный дубликат [FluentValidation - проверка нескольких свойств] (http://stackoverflow.com/questions/7701612/fluentvalidation-validating-across-multiple-properties) – bdeem

ответ

17

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

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

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

Смежные вопросы