我试图想出一个可以为null的属性验证,比如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
,返回new IgnoreNullStringLengthValidator
.在这里,您将创建一个IgnoreNullRangeValidatorAttribute
类.
得到的验证结果更符合您的预期,因为它不会隐式嵌套验证器.
您可以添加IgnoreNulls属性:
[IgnoreNulls()] [RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)] int? Age { get; set; }