Validator.TryValidateObject不验证属性

时间:2014-01-14 11:02:48

标签: c# validation asp.net-web-api data-annotations

使用WebApi v2我已经构建了一个以对象为参数的东西。我正在使用IValidateableObject和dataannotations进行模型验证,我使用WebApi过滤器触发。

但是,一个对象包含所有需要验证的项目数组。我已经创建了一个自定义属性,以便使用类似Asp.net Web Api nested model validation之类的东西来执行此操作,但我无法进行验证。另外 - 我已经使用了ValidateAllProperties标志。

所以我构建了一个控制台应用程序来验证行为并且似乎没有触发验证(或者我错误地调用了API)。这是对我不起作用的东西:

命名空间ConsoleApplication1 {     使用系统;     使用System.Collections.Generic;     使用System.ComponentModel.DataAnnotations;

class Program
{
    static void Main()
    {
        var s = new Boundary { LowerDecimal = 1.1m };
        var isValid = Validator.TryValidateObject(s, new ValidationContext(s, null, null), new List<ValidationResult>(), true);
        Console.WriteLine("Validation resulted in " + isValid);
        Console.ReadLine();
    }
}

public class Boundary
{
    [Range(0,1)]
    public decimal LowerDecimal { get; set; }
}

}

isValid始终返回true。我在这里做错了什么?

编辑 - 也尝试像这里定义MetaData类:Validation does not work when I use Validator.TryValidateObject

1 个答案:

答案 0 :(得分:9)

TryValidateObject是一个红色的鲱鱼,问题实际上在于RangeAttribute

问题是该属性有2个重载(一个用于int,一个用于double),在您的属性定义中,您已声明int值,这意味着内部属性值已转换到int会截断浮点数 - 所以实际上1.1会被截断为1,因此总是在范围内。

简单修复,确保您的属性知道您要比较double而不是int,即

[Range(0.0, 1.0)]
public decimal LowerDecimal { get; set; }