企业库验证块 - 验证可空属性?

Rob*_*ean 4 validation null enterprise-library

我试图想出一个可以为null的属性验证,比如int.

[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是,如果我设置Age为null验证失败,因为它不在范围内,我知道我也需要一个[ValidatorComposition(CompositionType.Or)],但我还应该使用什么呢?

Phi*_*ppe 6

虽然IgnoreNulls可以添加属性,但ValidationResults在返回验证结果时会导致复杂化.这是因为验证块隐式地将验证器包装成OrCompositeValidator- 属性可以为null或者它可以是指定范围内的整数.

验证失败时,顶级验证结果为OrCompositeValidator.要获得实际的RangeValidator验证结果,您现在需要深入NestedValidationResults查看ValidationResult对象的属性.

这似乎是处理验证结果消息的大量工作,所以在我看来必须有更好的方法.

这就是我做的.

  1. 我创建了一个名为的IgnoreNullStringLengthValidator继承自StringLengthValidator(这里你会继承RangeValidator)的类.
  2. 创建支持基本构造函数所需的所有构造函数.
  3. 覆盖DoValidate方法并检查空值 - 在这里你会写:

    if (!objectToValidate.HasValue) return;
    
    Run Code Online (Sandbox Code Playgroud)
  4. 确保下一行代码调用base.DoValidate(...).
  5. 创建一个名为的属性类IgnoreNullStringLengthValidatorAttribute,返回new IgnoreNullStringLengthValidator.在这里,您将创建一个IgnoreNullRangeValidatorAttribute类.

得到的验证结果更符合您的预期,因为它不会隐式嵌套验证器.


Ste*_*ins 5

您可以添加IgnoreNulls属性:

[IgnoreNulls()]
[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }
Run Code Online (Sandbox Code Playgroud)