将多个规则合并为一个规则
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 条件运算符?
使用多个预定义验证规则而不是一个自定义规则的原因是:
- 已在 MVC 中正确生成客户端验证属性
- 有不同的错误信息(通过使用默认错误信息,或
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()
方法中指定实际的 属性 名称。
我有以下规则:
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 条件运算符?
使用多个预定义验证规则而不是一个自定义规则的原因是:
- 已在 MVC 中正确生成客户端验证属性
- 有不同的错误信息(通过使用默认错误信息,或
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()
方法中指定实际的 属性 名称。