在MVC之外使用ASP.Net MVC数据注释

23

我想知道是否有一种方法可以在没有MVC网站的情况下使用ASP.Net的数据注释。

我的例子是,一旦创建了一个类,就需要对其进行验证,否则会抛出错误。我喜欢使用数据注释的方法,而不是由初始化器触发的一堆if块。

有没有办法让这个方法工作呢?

我认为它可能是这样的:

  • 添加数据注释
  • 在初始化程序中调用MVC验证器对该类进行验证的方法

有什么想法吗?我必须承认,我还没有将MVC框架添加到我的项目中,因为我希望只使用数据注释类System.ComponentModel.DataValidation。


我创建了自己的DataValidation类版本,如果有人感兴趣,我可能会外包它。这是在MVC2之前完成的,并且可以适应更复杂的情况。 - Yuriy Faktorovich
1个回答

34

这是一个示例:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

public class Foo
{
    [Required(ErrorMessage = "the Bar is absolutely required :-)")]
    public string Bar { get; set; }
}

class Program
{
    public static void Main()
    {
        var foo = new Foo();
        var results = new List<ValidationResult>();
        var context = new ValidationContext(foo, null, null);
        if (!Validator.TryValidateObject(foo, context, results))
        {
            foreach (var error in results)
            {
                Console.WriteLine(error.ErrorMessage);
            }
        }
    }
}

但说实话,FluentValidation 更加强大。


3
我正在寻找一个 .Net 3.5 的解决方案 - 在 .Net 4.0 之前,ValidationContext 是不可用的。 - Doug
1
@Doug 可能希望在问题中加入该要求。 - Nate-Wilkins
1
不幸的是,此验证不会递归遍历任何复杂的子对象或集合。Validator.TryValidateObject(...) 只会进行即时属性和字段验证,并在完成后停止,与 MVC 中控制器中模型绑定时发生的遍历整个对象图的验证相反。 - neumann1990
3
就我个人而言,按照现有的写法调用TryValidateObject方法只会检查RequiredAttribute属性。如果你想使用System.ComponentModel.DataAnnotations中的其他验证器,比如MaxLengthAttribute,请在第四个参数(validateAllProperties)处传入true。请参考https://dev59.com/Vm435IYBdhLWcg3whQc5上被接受的答案。 - Don Rowe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接