C# 将多个规则合并为一个规则
我有以下规则:C# 将多个规则合并为一个规则,c#,fluentvalidation,C#,Fluentvalidation,我有以下规则: RuleFor(x => x.FromNumber).NotEmpty().GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired); 属性FromNumber的类型为int?。上面的问题是,CustomState仅设置为大于。如果该值为null或0,CustomState为null 如果我将上述内容更改为以下内容,则规则仍按预期工作:
RuleFor(x => x.FromNumber).NotEmpty().GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired);
属性FromNumber
的类型为int?
。上面的问题是,CustomState
仅设置为大于
。如果该值为null或0,CustomState
为null
如果我将上述内容更改为以下内容,则规则仍按预期工作:
RuleFor(x => x.FromNumber ?? 0).GreaterThan(0).When(x => x.NumbersRequired).WithState(x => MyErrorEnum.FromNumberRequired);
但是,有没有更好的方法将两个规则合并为一个规则而不是使用空条件运算符?使用多个预定义的验证规则而不是一个自定义规则的原因如下:
WithMessage
方法)条件时使用了——它取消了为受影响规则生成的任何客户端属性
2-nd对于您的案例来说并不重要,因为如果需要,您可以将错误消息合并为一条
因此,您可以将规则组合为单个谓词规则:
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)
在构造错误字典时,不仅会更改已验证的值,而且还会以不可预知的方式更改引用的属性名。仅在RuleFor
/RuleForEach
方法中使用属性链表达式。如果您喜欢使用这样的复杂表达式,请不要忘记在.WithName()
方法中指定实际的属性名称。我将如何实现此规则:RuleFor(x=>x.ToNumber).NotEmpty().GreaterThan(x=>x.FromNumber)
?@Ivan MarkDebono使用另一个访问模型的重载:RuleFor(x=>x.ToNumber).Muxt((model,x)=>x!=null&&x>model.FromNumber);