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

Combine multiple rules into one rule

我有以下规则:

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);

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

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

  1. 已在 MVC 中正确生成客户端验证属性
  2. 有不同的错误信息(通过使用默认错误信息,或WithMessage方法)

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() 方法中指定实际的 属性 名称。