原文地址:http://www.asp.net/learn/mvc/tutorial-37-cs.aspx
不好意思,翻得有点烂啊。
本指南的目的是解释另一种在ASP.NET MVC中执行验证的途径。主要阐述如何阻止用户在提交HTML表单填写了一些不合法的内容,以及使用IErrorDataInfo执行验证。
先做一些假设
在本指南中,使用了MoviesDB数据库和Movies表,这是列的定义:
在本指南中,使用了Entity Framework生成数据库模型,这是生成的Movie类:
Controller类
使用HomeController显示movie列表以及创建新的movie,这是代码:
在HomeController中包含两个Create() action,第一个用于显示创建movie所需要的HTML表单,第二个执行插入数据库的操作。第二个Create()方法会在提交表单的时候调用。
注意第二个Create() action包含这样一些代码:
当验证出错的时候,IsVaild属性返回false。包含的HTML表单的视图(Create)会被重新显示。
创建一个部分类
Movie类是由Entity Framework生成的,如果在解决方案资源管理器中展开MoviesDBModel.edmx文件,可以看到它的代码(MoviesDBModel.Design.cs)。
Movie类是一个部分类(partial class),就是说可以添加另一个同名的部分类来扩展这个Movie类,我们会把我们的验证逻辑代码添加到部分类中。
首先添加一个部分类:
在这个部分类中你增加的任何方法属性都会被作为Entity Framework自动生成的Movie类的一部分。
增加OnChanging和OnChanged方法
当Entity Framework生成一个实体类的时候,Entity Framework会自动为类添加partial方法。Entity Framework生成OnChanging和OnChanged部分方法关联到每个属性。
这个例子中,Entity Framework为Movie类创建这些方法:
- OnIdChanging
- OnIdChanged
- OnTitleChanging
- OnTitleChanged
- OnDirectorChanging
- OnDirectorChanged
- OnDateReleasedChanging
- OnDateReleasedChanged
OnChanging方法在属性改变之前被响应,OnChanged方法在完成属性改变后执行。
你可以利用partial方法,把验证逻辑添加到Movie类中。图中修改后的Movie类验证Title和Director属性不能为空值。
注意:类中的部分(partial)方法定义了不需要实现的方法,如果你不实现partial方法,编译器会删除方法签名和该方法的所有调用,所以在部分方法中不会有运行时的性能损失。在Visual Studio代码编辑器中,你可以用关键字partial添加一个部分方法。
比如说,当你尝试指定一个空值到Title属性的时候,会有一条错误信息被指定到Dictionary对象_errors中 。
当你指定一个空字符串到Title属性的时候,错误信息会被添加到_error字段中,但不会有任何错误提示,我们需要在ASP.NET MVC Framework中实现IDataErrorInfo接口来显示这些验证错误。
实现IDataErrorInfo接口
IDataErrorInfo接口是.NET Framework的一部分,第一版就已经存在了,这是个非常简单的接口:
如果一个类实现了IDataErrorInfo接口,ASP.NET MVC Framework在创建实例的时候会自动使用这个接口,比如说,HomeController的Create action接受一个Movie实例参数:
Create action在创建Movie实例的时候,使用了一个模型绑定器(model binder,这里是DefaultModelBinder)。模型绑定器负责通过HTML表单的内容创建Movie对象。
无论一个类是否实现了IDataErrorInfo接口,DefaultModelBinder会进行检测,如果一个类实现了这个接口,模型绑定器会调用IDataErrorInfo接口方法,如果索引器返回一个错误,模型绑定器会把相应的错误信息自动添加到模型状态中。
DefaultModelBinder同样会检查IDataErrorInfo.Error属性。这个属性用于表现缺少属性的具体验证错误。比如说,你可能会使用一条验证规则,同时实施到多个属性上,会从Error属性中获得验证错误信息。
修改后的Movie类,实现了IDataErrorInfo接口:
索引器去检查_error集合是否传递给它了一个包含和属性名称对应的错误的键(key),如果没有验证错误,会返回一个空字符串。
在使用Movie类的时候,不需要对HomeController做任何修改。当Title和Director没有值输入的时候,会出现下面的页面:
注意,DateReleased值也被自动验证了,因为DateReleased属性不接收空值,DefaultModelBinder自动生成了它的验证错误信息。如果你要修改DateReleased属性的错误信息,需要创建一个自定义的模型绑定器。
总结
这篇指南中,可以学习到如何使用IDataErrorInfo接口生成验证错误信息。首先需要创建一个Movie的部分类来扩展Entity Framework生成的Movie类;然后再利用OnTitleChanging和OnDirectorChanging创建一些验证逻辑;最后,我们实现IDataErrorInfo接口,在ASP.NET MVC Framework中显示这些验证信息。