2016-07-08 4 views
4

У меня есть следующее правило:Объединение нескольких правил в одном правиле

RuleFor(x => x.FromNumber).NotEmpty().GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired); 

Свойство FromNumber имеет тип int?. Проблема с вышесказанным заключается в том, что CustomState установлен только для GreaterThan. Если значение равно null или 0, CustomState - null.

Если я изменю выше к следующему правилу до сих пор работает, как ожидалось:

RuleFor(x => x.FromNumber ?? 0).GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired); 

Но есть лучший способ совместить оба правила в одно правило, вместо того, чтобы использовать условный оператор нулевой?

ответ

1

Причины использовать несколько предопределенных правил проверки вместо одного обычая, являются:

  1. должным образом генерируется проверка на стороне клиента атрибутов в MVC
  2. имеют различные сообщения об ошибках (с помощью сообщений об ошибках по умолчанию, или WithMessage метод)

1-й причина не ваш случай, потому что вы используете When условия - оно отменяет любую сторону клиента атрибуты генерация для затронутых правил.

2-й не критичен для вашего случая, потому что вы можете комбинировать сообщения об ошибках в одном, если вам нужно это сделать.

Таким образом, вы можете объединить свои правила в одном правиле предиката:

RuleFor(x => x.FromNumber) 
    .Must(x => x != null && x > 0) 
    .When(x => x.NumbersRequired) 
    .WithState(x => MyErrorEnum.FromNumberRequired); 

P.S. Синтаксис как это:

RuleFor(x => x.FromNumber ?? 0) 
не

только изменения подтверждено значение, но также может изменить referrenced имя свойства непредсказуемым образом when constructing dictionary of errors. Используйте выражение цепочки свойств только в методах RuleFor/RuleForEach. Если вы предпочитаете использовать сложные выражения, подобные этому, не забудьте указать фактическое имя свойства в методе .WithName().

+0

Как бы реализовать это правило: 'RuleFor (x => x.ToNumber) .NotEmpty(). GreaterThan (x => x.FromNumber)'? –

+0

@ Ivan-MarkDebono использует другую перегрузку с доступом к модели: 'RuleFor (x => x.ToNumber) .Muxt ((model, x) => x! = Null && x> model.FromNumber);' –

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