2016-07-08 68 views
4

我有以下规则:将多个规则转化为一个规则

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

酒店FromNumberint?类型。上面的问题是CustomState只设置为GreaterThan。如果值为空或0,则CustomState为空。

如果我改变上述以下规则仍然按预期工作:

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

但是,有没有更好的办法,以这两个规则组合成一个规则,而不是使用空条件运算符?

回答

1

,而不是使用一个自定义多个预定义的验证规则的原因,有:在MVC

  1. 已经适当地生成客户端验证属性
  2. 有不同的错误消息(通过使用默认的错误消息,或WithMessage法)

1日原因不是你的情况,因为你用When条件 - 它取消任何客户端属性代受影响的规则。

2 -nd对于您的情况不是至关重要的,因为如果您需要这样做,您可以将错误消息合并为一个错误消息。

所以您可以将规则组合成单个预测规则:

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

附:语法是这样的:

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

不仅改变验证值,而且还可以在不可预知的方式改变when constructing dictionary of errors referrenced属性名称。仅在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);' –