Validator.TryValidateObject不验证属性

Joc*_*ick 2 c# validation data-annotations asp.net-web-api

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

但是,一个对象包含所有需要验证的项目数组.我已经创建了一个自定义属性,以便使用像Asp.net Web Api嵌套模型验证这样做,但我无法进行验证.另外 - 我已经使用了ValidateAllProperties标志.

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

namespace ConsoleApplication1 {using System; 使用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; }
}
Run Code Online (Sandbox Code Playgroud)

}

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

编辑 - 也尝试像这里定义MetaData类:当我使用Validator.TryValidateObject时,验证不起作用

Jam*_*mes 9

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

问题是属性有2个重载(一个for int和one for double),在你的属性定义中你已经声明了int值,这意味着内部属性值被强制转换int为截断浮点 - 所以本质上1.1会被截断为1所以总是在范围内.

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

[Range(0.0, 1.0)]
public decimal LowerDecimal { get; set; }
Run Code Online (Sandbox Code Playgroud)