我想使用.NET StringLength和Range属性来为我的类中的各种属性设置约束。我写了以下非常简单的代码:
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的上下文中显示它们,但是文档没有引用它。
答案 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。它允许您以一种很好的方式表达更复杂的验证规则,否则使用数据注释很难实现这些规则。