我正在尝试对可空属性(例如 int)进行验证。
例子
[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }
但是,如果我设置Age
为 null 验证失败,因为它不在范围内,我知道我也需要一个[ValidatorComposition(CompositionType.Or)]
,但我还应该使用什么?
我正在尝试对可空属性(例如 int)进行验证。
例子
[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }
但是,如果我设置Age
为 null 验证失败,因为它不在范围内,我知道我也需要一个[ValidatorComposition(CompositionType.Or)]
,但我还应该使用什么?
虽然IgnoreNulls
可以添加属性,但ValidationResults
在返回验证结果时会导致混乱。这是因为验证块隐式地将验证器包装到一个OrCompositeValidator
- 属性可以是 null 或者它可以是指定范围内的整数。
当验证失败时,顶级验证结果为OrCompositeValidator
. 要获得实际的RangeValidator
验证结果,您现在需要深入了解对象的NestedValidationResults
属性ValidationResult
。
处理验证结果消息似乎需要做很多工作,所以在我看来,必须有更好的方法。
这就是我所做的。
IgnoreNullStringLengthValidator
,它继承自StringLengthValidator
(在这里你将继承RangeValidator
)。覆盖该DoValidate
方法并检查空值 - 在这里你会写:
if (!objectToValidate.HasValue) return;
base.DoValidate(...)
。IgnoreNullStringLengthValidatorAttribute
,它返回新的IgnoreNullStringLengthValidator
. 在这里,您将创建一个IgnoreNullRangeValidatorAttribute
类。生成的验证结果更符合您的预期,因为它不会隐式嵌套您的验证器。
您可以添加 IgnoreNulls 属性:
[IgnoreNulls()]
[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }
是的,但是如果RangeValidator
原因 a ValidationResult
,那么由于某种原因,我最终得到了两个ValidationResults
... 一个正确用于范围验证问题,但是另一个神秘的说:
该值不为 null,并且未通过键 Age 的所有验证规则。
这很愚蠢,我不希望IgnoreNulls
验证器产生验证结果!它真的是用来修改其他的,不是吗?再加上在使用多态性时缺乏真正的验证继承和功能,还有很多其他事情,而且 VAB 属性有很多“小”问题,我发现它无法用于任何琐碎的事情。