我使用 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
最佳答案
TryValidateObject
是一个转移注意力的问题,问题实际上在于 RangeAttribute
。
问题是该属性有 2 个重载(一个用于 int
,一个用于 double
),在您的属性定义中您声明了 int
values 这意味着在内部属性值被转换为 int
这将截断 float - 所以本质上 1.1
将被截断为 1
始终在范围内。
简单的修复,确保你的属性知道你想要比较double
而不是int
,即
[Range(0.0, 1.0)]
public decimal LowerDecimal { get; set; }
关于c# - Validator.TryValidateObject 不验证属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21111905/