c# - Validator.TryValidateObject 不验证属性

标签 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

最佳答案

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/

相关文章:

eclipse - 如何在 Eclipse 中关闭特定项目的验证?

c# - 仅由我的网站调用 Web Api

c# - Facebook SDK .NET - (#200) 用户尚未授权应用程序执行此操作

c# - 如何旋转 System.Drawing.Image x 度?

forms - Bootstrap-vue with Vuelidate,如何在初始状态停止验证表单

asp.net-mvc - asp.net mvc 数据库交互验证

asp.net-mvc-4 - MVC API CORS 重复的 Access-Control-Allow-Origin header

c# - Web API 中的更新方法 : How to know which fields to update?

c# - 如何在代码中访问属性摘要?

c# - ODAC/Oracle 等同于 Linq to Entities GroupBy FirstOrDefault