我在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”时生气。
我错过了什么?
提前致谢。
答案 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的,但仍然适用于手头的主题。
答案 2 :(得分:3)
MVC如何知道添加 模型状态的验证错误 字典?
ModelValidatorProvider,更具体地说,DataAnnotationsModelValidatorProvider。这是由MVC调用的。
答案 3 :(得分:0)
因为您没有检查模型是否有效...数据符号检查模型的有效性。然后你会得到你的错误。