关于c#:Validator.TryValidateObject不验证属性

Validator.TryValidateObject does not validate attribute

使用WebApi v2,我构建了将对象作为参数的对象。我同时使用IValidateableObject和dataannotation对通过WebApi过滤器触发的模型进行验证。

但是,一个对象包含一组需要全部验证的项目。我创建了一个自定义属性,以使用诸如Asp.net Web Api嵌套模型验证之类的方法来执行此操作,但是我无法进行验证。另外-我已经使用ValidateAllProperties标志。

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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类,如下所示:当我使用Validator.TryValidateObject时,验证不起作用


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

问题在于属性有2个重载(一个重载int和一个重载double),在属性定义中,您已经声明了int值,这意味着在内部将属性值强制转换为int,这将截断浮动 点-本质上1.1将被截断为1,因此将始终在范围内。

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

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