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

时间:2016-07-08 08:36:11

标签: c# fluentvalidation

我有以下规则:

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

属性FromNumber的类型为int?。上述问题是CustomState仅针对GreaterThan设置。如果值为null或0,则CustomState为空。

如果我将上述内容更改为以下规则,则规则仍然按预期工作:

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. 在MVC中正确生成了客户端验证属性
  2. 有不同的错误消息(使用默认错误消息或WithMessage方法)
  3. 1-st 原因不是您的情况,因为您使用When条件 - 它会取消受影响规则的任何客户端属性生成。

    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)
    

    不仅可以更改已验证的值,还可以以不可预测的方式when constructing dictionary of errors更改引用的属性名称。仅在RuleFor / RuleForEach方法中使用属性链表达式。如果您更喜欢使用这样的复杂表达式 - 请不要忘记在.WithName()方法中指定实际的属性名称。