5

我正在尝试对可空属性(例如 int)进行验证。

例子

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

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

4

3 回答 3

7

虽然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类。

生成的验证结果更符合您的预期,因为它不会隐式嵌套您的验证器。

于 2010-06-16T19:29:13.220 回答
5

您可以添加 IgnoreNulls 属性:

[IgnoreNulls()]
[RangeValidator(0, RangeBoundaryType.Inclusive, 1, RangeBoundaryType.Inclusive)]
int? Age { get; set; }
于 2009-01-20T06:41:34.410 回答
1

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

该值不为 null,并且未通过键 Age 的所有验证规则。

这很愚蠢,我不希望IgnoreNulls验证器产生验证结果!它真的是用来修改其他的,不是吗?再加上在使用多态性时缺乏真正的验证继承和功能,还有很多其他事情,而且 VAB 属性有很多“小”问题,我发现它无法用于任何琐碎的事情。

于 2009-11-09T20:04:43.153 回答