是否可以将Required ValidationAttribute 与值类型一起使用?

Row*_*haw 3 c# data-annotations

我装饰了一堂课:

[Required(ErrorMessage = "Price is required.")]
public decimal Price { get; set; }
Run Code Online (Sandbox Code Playgroud)

但是当用代码验证它时:

   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));
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

Ree*_*sey 5

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

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

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