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

时间:2009-01-20 06:24:39

标签: validation null enterprise-library

我正在尝试为可以为空的属性进行验证,例如int。

实施例

[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }

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

3 个答案:

答案 0 :(得分:6)

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

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

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

这就是我所做的。

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

    if (!objectToValidate.HasValue) return;
    
  4. 确保您的下一行代码调用base.DoValidate(...)
  5. 创建了一个名为IgnoreNullStringLengthValidatorAttribute的属性类,它返回新的IgnoreNullStringLengthValidator。在这里,您将创建一个IgnoreNullRangeValidatorAttribute类。
  6. 结果验证结果更符合您的预期,因为它不会隐式嵌套验证器。

答案 1 :(得分:5)

您可以添加IgnoreNulls属性:

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

答案 2 :(得分:1)

是的,但是如果RangeValidator导致ValidationResult,那么由于某种原因,我最终得到两个ValidationResults ...一个正确用于范围验证问题,但接着另一个神秘的问题那说:

  

该值不为null且未通过密钥Age的所有验证规则。

这很愚蠢,我不想让IgnoreNulls验证器导致验证结果!它真的有修改其他的,不是吗?在使用多态时,以及许多其他事情,加上缺乏真正的验证继承和功能,并且VAB属性存在很多“小”问题,我发现它无法用于除了琐碎之外的任何事情。