将多个规则合并为一个规则

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
使用多个预定义验证规则而不是一个自定义规则的原因如下:
  1. 在MVC中生成正确的客户端验证属性
  2. 使用默认错误消息或 WithMessage 方法来获取不同的错误消息
第一 个原因不适用于您的情况,因为您使用了 When 条件 - 它会取消任何受影响规则的客户端属性生成。 第二 不是您的情况必须考虑的问题,因为如果需要,您可以将错误消息合并成一个。
因此,您可以将规则组合成单个谓词规则:
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-Mark Debono
@Ivan-MarkDebono 使用另一个可以访问模型的重载: RuleFor(x => x.ToNumber).Muxt((model, x) => x != null && x > model.FromNumber); - David Levin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接