数据注释如何工作?

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

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

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”时,我期待它生气。

我错过了什么?

提前致谢。

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

手动validation值

如果不使用DataGrid控件提供编辑数据的界面,则不会自动应用validation属性。 但是,您可以使用Validator类手动应用validation测试。 您可以在属性的set访问器上调用ValidateProperty方法,以根据属性的validation属性检查值。 当数据绑定从validation属性接收validationexception时,还必须将ValidatesOnExceptionsNotifyOnValidationError属性都设置为true。 有关手动应用validation的示例,请参阅下面的数据绑定示例。

那么MVC如何知道将validation错误添加到模型状态字典中?

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

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

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

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

属性简介

属性

DataTypeAttributes

使用带有silverlight的数据注释

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