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