郁闷的PP

博客园 首页 新随笔 联系 订阅 管理

原文地址:http://www.asp.net/learn/mvc/tutorial-37-cs.aspx

不好意思,翻得有点烂啊。

本指南的目的是解释另一种在ASP.NET MVC中执行验证的途径。主要阐述如何阻止用户在提交HTML表单填写了一些不合法的内容,以及使用IErrorDataInfo执行验证。

先做一些假设

在本指南中,使用了MoviesDB数据库和Movies表,这是列的定义:

image

在本指南中,使用了Entity Framework生成数据库模型,这是生成的Movie类:

image

Controller类

 

使用HomeController显示movie列表以及创建新的movie,这是代码:

image

在HomeController中包含两个Create() action,第一个用于显示创建movie所需要的HTML表单,第二个执行插入数据库的操作。第二个Create()方法会在提交表单的时候调用。

注意第二个Create() action包含这样一些代码:

image

当验证出错的时候,IsVaild属性返回false。包含的HTML表单的视图(Create)会被重新显示。

创建一个部分类

Movie类是由Entity Framework生成的,如果在解决方案资源管理器中展开MoviesDBModel.edmx文件,可以看到它的代码(MoviesDBModel.Design.cs)。

image

Movie类是一个部分类(partial class),就是说可以添加另一个同名的部分类来扩展这个Movie类,我们会把我们的验证逻辑代码添加到部分类中。

首先添加一个部分类:

image

在这个部分类中你增加的任何方法属性都会被作为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添加一个部分方法。

image

比如说,当你尝试指定一个空值到Title属性的时候,会有一条错误信息被指定到Dictionary对象_errors中 。

当你指定一个空字符串到Title属性的时候,错误信息会被添加到_error字段中,但不会有任何错误提示,我们需要在ASP.NET MVC Framework中实现IDataErrorInfo接口来显示这些验证错误。

实现IDataErrorInfo接口

IDataErrorInfo接口是.NET Framework的一部分,第一版就已经存在了,这是个非常简单的接口:

image

如果一个类实现了IDataErrorInfo接口,ASP.NET MVC Framework在创建实例的时候会自动使用这个接口,比如说,HomeController的Create action接受一个Movie实例参数:

image

Create action在创建Movie实例的时候,使用了一个模型绑定器(model binder,这里是DefaultModelBinder)。模型绑定器负责通过HTML表单的内容创建Movie对象。

无论一个类是否实现了IDataErrorInfo接口,DefaultModelBinder会进行检测,如果一个类实现了这个接口,模型绑定器会调用IDataErrorInfo接口方法,如果索引器返回一个错误,模型绑定器会把相应的错误信息自动添加到模型状态中。

DefaultModelBinder同样会检查IDataErrorInfo.Error属性。这个属性用于表现缺少属性的具体验证错误。比如说,你可能会使用一条验证规则,同时实施到多个属性上,会从Error属性中获得验证错误信息。

修改后的Movie类,实现了IDataErrorInfo接口:

image

索引器去检查_error集合是否传递给它了一个包含和属性名称对应的错误的键(key),如果没有验证错误,会返回一个空字符串。

在使用Movie类的时候,不需要对HomeController做任何修改。当Title和Director没有值输入的时候,会出现下面的页面:

image

注意,DateReleased值也被自动验证了,因为DateReleased属性不接收空值,DefaultModelBinder自动生成了它的验证错误信息。如果你要修改DateReleased属性的错误信息,需要创建一个自定义的模型绑定器。

总结

这篇指南中,可以学习到如何使用IDataErrorInfo接口生成验证错误信息。首先需要创建一个Movie的部分类来扩展Entity Framework生成的Movie类;然后再利用OnTitleChanging和OnDirectorChanging创建一些验证逻辑;最后,我们实现IDataErrorInfo接口,在ASP.NET MVC Framework中显示这些验证信息。

posted on 2009-03-12 14:54  郁闷的PP  阅读(759)  评论(1编辑  收藏  举报