3

我用以下方式装饰了一个班级:

[Required(ErrorMessage = "Price is required.")]
public decimal Price { get; set; }

但是在用代码验证它时:

   for each (PropertyInfo prop in Me.GetType().GetProperties())
   {
        if (prop.GetIndexParameters().Length = 0)
        {
            for each (ValidationAttribute validatt in prop.GetCustomAttributes(GetType(ValidationAttribute), True))
            {
                if (!validatt.IsValid(prop.GetValue(Me, Nothing))
                {
                    retval.Add(New PropertyValidationError(prop.Name, string.Format("There is a problem with the {0} property. It is flagged with the {1}", prop.Name, validatt.GetType.Name), validatt.ErrorMessage));
                }
            }
        }
    }

我发现 的值0被视为满足“要求”,这不是我想要的(事实上,我想允许除零以外的任何值) - 是我的验证代码做错了事,还是有没有一种方法可以使用带有 a 的装饰,但ValidationAttribute对于值类型的默认值会失败?

4

3 回答 3

5

当您使用值类型时,例如decimal不可能没有值。因此,该属性实际上是没有意义的。

最好使用[Range],因为这允许您指定有意义的值。但是,这将不允许您处理“任何非零值”(尽管您可以轻松处理任何正的非零值)。

如前所述,您的标准将需要创建自定义验证属性来验证,因为“除 default(T) 以外的任何值”都不是内置验证。

于 2013-06-13T16:28:06.843 回答
2

让你的值类型变量可以为空怎么办?

public decimal? Price { get; set; }
于 2018-10-31T14:55:28.183 回答
1

使用范围验证属性。

[Range(min, max, ErrorMessage )]
于 2013-06-13T16:25:16.650 回答