数据注释如何工作?

时间:2011-06-27 17:39:22

标签: c# asp.net-mvc validation asp.net-mvc-3 data-annotations

我在ASP.NET MVC 3项目中使用Data Annotations来验证模型。这些都非常方便,但目前它们对我来说都很神奇。我读到数据注释抛出异常。那么MVC如何知道将验证错误添加到模型状态字典中?如果没有抛出异常,由于模型验证而在模型上设置属性的失败如何冒泡到MVC?我总是假设每次属性失败时抛出异常,并且MVC模型绑定捕获异常并将其添加到模型状态字典中。

为了测试这个,我创建了一个控制台应用程序,并添加了一个带有验证注释的示例类:

public class MyObject
{
    [StringLength(10, MinimumLength=3)]
    public string Name { get; set; }
}

然后我实例化了该对象,并尝试为Name属性分配小于3的值。尽管注释表明字符串长度小于3,但该属性分配得很好。

    static void Main(string[] args)
    {
        MyObject mine = new MyObject();
        mine.Name = "hi";
        Console.WriteLine(mine.Name);
        Console.ReadLine();
    }

这个小程序向控制台写出“hi”。为什么?我试图将mine.Name设置为“hi”时生气。

我错过了什么?

提前致谢。

4 个答案:

答案 0 :(得分:16)

您永远不会调用任何内容来验证属性。验证不会自己神奇地发生。来自http://msdn.microsoft.com/en-us/library/dd901590%28v=vs.95%29.aspx

  

手动验证值

     

不使用DataGrid时   控件提供接口   编辑数据,验证   属性不是自动的   应用。但是,您可以手动   使用。应用验证测试   Validator课程。你可以打电话给   集合上的ValidateProperty方法   财产的存取者来检查   对验证的价值   属性的属性。你必须   同时设置ValidatesOnExceptions   和NotifyOnValidationError属性   当数据绑定接收时为true   验证的验证异常   属性。有关手动的示例   应用验证,请参阅数据   下面的绑定示例。

答案 1 :(得分:3)

  

C#提供了一种定义声明标记的机制,称为   属性,您可以将其放置在源中的某些实体上   用于指定其他信息的代码。这些信息   可以在运行时通过反射检索属性包含。

https://msdn.microsoft.com/en-us/library/aa288059(v=vs.71).aspx

以下三篇文章有助于扩展您对属性如何工作的了解。如果您了解如何使用它们,那么最后一个是最不重要的。这篇文章是针对silverlight的,但仍然适用于手头的主题。

Introduction to Attributes

Attributes

DataTypeAttributes

Using Data Annotations w/ silverlight

答案 2 :(得分:3)

  

MVC如何知道添加   模型状态的验证错误   字典?

ModelValidatorProvider,更具体地说,DataAnnotationsModelValidatorProvider。这是由MVC调用的。

答案 3 :(得分:0)

因为您没有检查模型是否有效...数据符号检查模型的有效性。然后你会得到你的错误。