Asp.Net MVC4入门指南(8):给数据模型添加校验器

在本节中将会给Movie模型添加验证逻辑。而且确保这些验证规则在用户建立或编辑电影时被执行。html

保持事情 DRY

ASP.NET MVC 的核心设计信条之一是DRY: "不要重复本身(Don’t Repeat Yourself)"。ASP.NET MVC鼓励您指定功能或者行为,只作一次,而后将它应用到应用程序的各个地方。这能够减小您须要编写的代码量,并减小代码出错率,易于代码维护。jquery

给ASP.NET MVC 和 Entity Framework Code First 提供验证支持是 DRY 信条的一次伟大实践。您能够在一个地方 (模型类) 中以声明的方式指定验证规则,这个规则会在应用程序中的任何地方执行。git

让咱们看看您如何在本电影应用程序中,使用此验证支持。github

给电影模型添加验证规则

您将首先向Movie类添加一些验证逻辑。web

打开Movie.cs文件。在文件的顶部添加using语句,从而引用System.ComponentModel.DataAnnotations命名空间:正则表达式

using System.ComponentModel.DataAnnotations;

注意,该命名空间不包含System.Web。DataAnnotations 提供了一组内置的验证特性,您能够以声明的方式,应用于任何类或属性。数据库

更新Movie类,以利用内置的RequiredStringLengthRange验证属性。如下面的代码为例,以应用验证属性。express

?浏览器

运行该应用程序,您会再次获得了如下的运行时错误:服务器

The model backing the 'MovieDBContext' context has changed since the database was created. Consider using Code First Migrations to update the database (http://go.microsoft.com/fwlink/?LinkId=238269).

咱们将使用Migrations来更新 Schema。生成解决方案,而后打开软件包管理器控制台窗口,并输入如下命令:

add-migration AddDataAnnotationsMig
update-database

当此命令完后,Visual Studio会打开指定名称 (AddDataAnnotationsMig)的文件,其中定义了派生自DbMIgration的新类,并在Up方法中,您能够看到代码更新的Schema 和约束条件。TitleGenre 字段再也不能够为 null (即,您必须输入一个值) 而且Rating 字段具备最大长度是 5。

验证属性将指定一个验证行为,这样您能够指定模型中的那个属性须要被强制验证。Required属性指示该属性必须有一个值 ,在此示例中,一部电影必需要有TitleReleaseDateGenrePrice属性的值,这样才有效。Range属性限制了一个指定范围内的值。StringLength属性容许您设置一个字符串属性的最大长度和其最小长度(可选)。内部类型 (例如decimal, int, float, DateTime)默认是必须的,因此不须要Required 属性。

Code First 确保您在模型类上所指定的验证规则,会在应用程序修改数据库以前执行。例如,下面的代码在调用SaveChanges方法时,将引起异常,由于缺失几个必需的Movie属性值,而且价格为零 (这在有效范围以外)。

?

验证规则会自动被 .NET Framework执行,这将有助于使您的应用程序更加的可靠。它还确保你不会由于忘了验证,无心中使得坏的数据也写入到了数据库。

下面是更新后的Movie.cs文件的完整代码清单:

?

ASP.NET MVC 的验证错误UI

从新运行应用程序,浏览 /Movies的 URL。

单击Create New连接,来添加一部新电影。在窗体中填写一些无效值,而后单击Create按钮。

image

注意,为了使jQuery支持使用逗号的非英语区域的验证 ,须要设置逗号(",")来表示小数点,你须要引入globalize.js而且你还须要具体的指定cultures/globalize.cultures.js文件 (地址在https://github.com/jquery/globalize) 在 JavaScript 中可使用 Globalize.parseFloat。下面的代码展现了在"FR-FR" Culture下的Views\Movies\Edit.cshtml 视图:

?

为了使用这种用户验证界面,真正的好处是,您不须要修改MoviesController类或Create.cshtml视图中的任何一行代码。在本教程以前所生成的控制器和视图中,Movie模型类的属性上所指定的验证规则同样能够自动适用。

您可能已经注意到了TitleGenre属性,在字段中输入文本或者删除文本,是不会执行所需的验证属性的,直到您提交表单 (点Create按钮)时才执行。对于字段是最初为空 (如建立视图中的字段) 和只有Required属性并无其它验证属性的字段,您能够执行如下操做来触发验证:

1. Tab into the field.

2. Enter some text.

3. Tab out.

4. Tab back into the field.

5. Remove the text.

6. Tab out.

上面的顺序将触发必需的验证,而并不须要点击提交按钮。在不输入任何字段的状况下,直接点击提交按钮,将触发客户端验证。直到没有客户端验证错误的状况下,表单数据才会发送到服务器。您能够在服务器端HTTP Post 方法上加上断点来测试一下,或者使用Fiddler tool或 IE 9 F12 Developer tools.

image

如何验证建立视图和建立方法

您可能很想知道验证用户界面在没有更新控制器或视图代码的状况下是如何生成的。下面列出了MovieController类中的Create方法。它们是以前教程中自动生成的,并无修改。

?

第一种(HTTP GET)Create 方法用来显示初始的建立form。第二个 ([HttpPost]) 方法处理form的请求。第二种Create方法 (HttpPost 版本) 调用 ModelState.IsValid来检查是否有的任何的Movie验证错误。调用此方法将验证对象上全部应用了验证约束的属性。若是对象含有验证错误,则Create方法会从新显示初始的form。若是没有任何错误,方法将保存信息到数据库。在咱们的电影示例中,咱们使用了验证,当客户端检测到错误时,form不会被post到服务器;因此第二个Create方法永远不会被调用。若是您在浏览器中禁用了 JavaScript,客户端验证也会被禁用,HTTP POST Create方法会调用 ModelState.IsValid来检查影片是否含有任何验证错误。

您能够在HttpPost Create方法中设置一个断点,当客户端验证检测到错误时,不会post form数据,因此永远不会调用该方法。若是您在浏览器中禁用 JavaScript,而后提交具备错误信息的form,断点将会命中。您仍然获得充分的验证,即便在没有 JavaScript的状况下。下图显示了如何禁用 Internet Explorer 中的 JavaScript。

image

image

下图显示了如何在火狐浏览器中禁用 JavaScript。

image

下图显示了如何在 Chrome 浏览器中禁用 JavaScript。

image

下面是框架代码在以前的教程中生成的Create.cshtml视图模板。它用来为以上两个操做方法来显示初始的form,同时在验证出错时来从新显示视图。

?

请注意,代码如何使用Html.EditorFor helper 输出为Movie中的每一个属性的<input>元素。此Helper旁边是对Html.ValidationMessageFor方法的调用。这两个Helper方法将处理由控制器传递到视图的模型对象(在这里是,Movie对象)。它们会自动查找模型中指定的验证属性,并显示适当的错误消息。

若是您想要在后面更改验证逻辑,您能够作在一个地方,将验证信息添加到模型上。 (此示例中,是movie 类)。您没必要担忧不符合规则 ,验证逻辑会在应用程序的不一样部分执行――在一个地方定义验证逻辑将会被使用到各个地方。这使代码很是干净,并使它易于维护和扩展。它意味着您会彻底遵照DRY原则。

给影片模型添加Formatting

打开Movie.cs文件并查看Movie 类。System.ComponentModel.DataAnnotations命名空间提供了内置的验证特性集的格式属性。咱们已经为发布日期和价格字段应用了DataType枚举值。下面的代码示例了ReleaseDatePrice属性与相应的DisplayFormat属性。

?

DataType属性不是验证特性,它们用来告诉视图引擎如何Render HTML 。在上面的示例中, DataType.Date属性将影片日期显示为日期,例如,下面的DataType属性不会验证数据的格式:

[DataType(DataType.EmailAddress)] [DataType(DataType.PhoneNumber)] [DataType(DataType.Url)]

上面列出的属性只提供视图引擎来显示数据的格式(如:<a> 为 URL ,< href="mailto:EmailAddress.com"> 为电子邮件。您可使用正则表达式属性来验证数据的格式。)

另外一种使用DataType 属性的方式,您能够显式设置DataFormatString。下面的代码示例了具备一个日期格式字符串的Release Date属性 (即"d")。

       [DisplayFormat(DataFormatString = "{0:d}")]        public DateTime ReleaseDate { get; set; }

下面的代码设置Price属性为货币格式。

       [DisplayFormat(DataFormatString = "{0:c}")]        public decimal Price { get; set; }

完整的Movie 类以下所示。

?

运行该应用程序并浏览到Movies控制器。很好的格式化了发布日期和价格。下图显示了Release Date和使用 "FR-FR" Culture 的Price。

image

下图为默认Culture的显示(English US) 。

image

在下一部分,咱们先会看看代码,而后再改进一下自动生成的DetailsDelete 方法。有了本节介绍的内容,相信你们已经掌握了给数据模型添加校验器的方法。后面你们在进行MVC开发时,一方面能够运用本节知识,一方面也能够借助一些开发工具。ComponentOne Studio ASP.NET MVC 是一款针对 MVC 平台的控件包,能提供从桌面到移动设备的用户体验。

 

 

--------------------------------------------------------------------------------------------------------------------

译者注:

本系列共9篇文章,翻译自Asp.Net MVC4 官方教程,因为本系列文章言简意赅,篇幅适中,从一个示例开始讲解,全文最终完成了一个管理影片的小系统,很是适合新手入门Asp.Net MVC4,并由此开始开发工做。9篇文章为:

1. Asp.Net MVC4 入门介绍

・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/intro-to-aspnet-mvc-4

・ 译文地址:http://www.cnblogs.com/powertoolsteam/archive/2012/11/01/2749906.html

2. 添加一个控制器

・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-controller

・ 译文地址:http://www.cnblogs.com/powertoolsteam/archive/2012/11/02/2751015.html

3. 添加一个视图

・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-view

・ 译文地址:http://www.cnblogs.com/powertoolsteam/archive/2012/11/06/2756711.html

4. 添加一个模型

・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model

・ 译文地址:http://www.cnblogs.com/powertoolsteam/archive/2012/12/17/2821495.html

5. 从控制器访问数据模型

・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/accessing-your-models-data-from-a-controller

・ 译文地址:http://www.cnblogs.com/powertoolsteam/archive/2013/01/11/2855935.html

6. 验证编辑方法和编辑视图

・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-edit-methods-and-edit-view

・ 译文地址:http://www.cnblogs.com/powertoolsteam/archive/2013/01/24/2874622.html

7. 给电影表和模型添加新字段

・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-new-field-to-the-movie-model-and-table

・ 译文地址:http://powertoolsteam.blog.51cto.com/2369428/1140334

8. 给数据模型添加校验器

・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-validation-to-the-model

・ 译文地址:http://powertoolsteam.blog.51cto.com/2369428/1147449

9. 查询详细信息和删除记录

・ 原文地址:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/examining-the-details-and-delete-methods

・ 译文地址:http://powertoolsteam.blog.51cto.com/2369428/1149311

10.第三方控件Studio for ASP.NET Wijmo MVC4 工具应用

・ 地址:http://powertoolsteam.blog.51cto.com/2369428/1196469

相关文章
相关标签/搜索