可以在MVC应用程序之外使用.NET Range和StringLength属性吗?

时间:2012-03-26 17:21:02

标签: asp.net-mvc attributes

我想使用.NET StringLengthRange属性来为我的类中的各种属性设置约束。我写了以下非常简单的代码:

class AttributePlayground
{
    [StringLength(5)]
    public static String StringLengthTest { get; set; }

    [Range(10, 20)]
    public static int Age { get; set; }
}

static void Main(string[] args)
{
    AttributePlayground.StringLengthTest = "Too long!";
    AttributePlayground.Age = 34;    
}

我预计会发生错误或异常,但一切正常。

我在网上看到的关于这些属性的所有示例都在MVC的上下文中显示它们,但是文档没有引用它。

1 个答案:

答案 0 :(得分:3)

如您所知,.NET中的属性只是在编译时烘焙到程序集中的元数据。如果没有什么可以解释它们,那么什么都不会发生。

因此,在ASP.NET MVC的例子中,有一个验证器可以解释这些属性,如下所示:

class AttributePlayground
{
    [StringLength(5)]
    public String StringLengthTest { get; set; }

    [Range(10, 20)]
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        var attributePlayground = new AttributePlayground();
        attributePlayground.StringLengthTest = "Too long!";
        attributePlayground.Age = 34;

        var context = new ValidationContext(attributePlayground, null, null);
        var errors = new List<ValidationResult>();
        if (!Validator.TryValidateObject(attributePlayground, context, errors, true))
        {
            foreach (var error in errors)
            {
                Console.WriteLine(error.ErrorMessage);
            }
        }
    }
}

但老实说,如果你打算做一些更严肃和复杂的验证,我建议你不要使用声明验证逻辑,这就是数据注释。我建议你FluentValidation.NET。它允许您以一种很好的方式表达更复杂的验证规则,否则使用数据注释很难实现这些规则。