ASP.NET MVC 音乐商店 - 6. 使用 DataAnnotations 进行模型验证
在前面的创建专辑与编辑专辑的表单中存在一个问题:我们没有进行任何验证。字段的内容可以不输入,或者在价格的字段中输入一些字符,在执行程序的时候,这些错误会导致数据库保存过程中出现错误,我们将会看到来自数据库的错误信息。
通过为模型类增加数据描述的 DataAnnotations ,我们可以容易地为应用程序增加验证的功能。DataAnnotations 允许我们描述希望应用在模型属性上的验证规则,ASP.NET MVC 将会使用这些 DataAnnotations ,然后将适当的验证信息返回给用户。
为专辑表单增加验证
我们将会使用下列的 DataAnnotations
- Required 必须 – 表示这个属性是必须提供内容的字段
- DisplayName 显示名 – 定义表单字段的提示名称
- StringLength 字符串长度 – 定义字符串类型的属性的最大长度
- Range 范围 – 为数字类型的属性提供最大值和最小值
- Bind 绑定 – 列出在将请求参数绑定到模型的时候,包含和不包含的字段
- ScaffoldColumn 支架列 - 在编辑表单的时候,需要隐藏起来的的字符
注意:更多关于模型验证的信息,请参考:http://msdn.microsoft.com/zh-cn/library/ee256141%28VS.100%29.aspx
打开 Album 类,首先增加下面的 using 语句,这些语句引用了 DataAnnotations 使用的命名空间。
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
然后,更新属性,增加显示和验证的 DataAnnotations
namespace MvcMusicStore.Models
{
[Bind(Exclude = "AlbumId")]
public class Album
{
[ScaffoldColumn(false)]
public int AlbumId { get; set; }
[DisplayName("Genre")]
public int GenreId { get; set; }
[DisplayName("Artist")]
public int ArtistId { get; set; }
[Required(ErrorMessage = "An Album Title is required")]
[StringLength(160)]
public string Title { get; set; }
[Required(ErrorMessage = "Price is required")]
[Range(0.01, 100.00,
ErrorMessage = "Price must be between 0.01 and 100.00")]
public decimal Price { get; set; }
[DisplayName("Album Art URL")]
[StringLength(1024)]
public string AlbumArtUrl { get; set; }
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
}
}
然后,将专辑 Album 的属性 Genre 和 Artist 设置为虚拟的 virtual ,这将会使 EF-Code First 使用延迟加载。
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
为专缉修改完成之后,我们的创建和编辑界面立即就会验证字段,并且使用我们提供的显示名称,例如 AlbumArtUrl 将会成为 Album Art URL 等等。运行程序,浏览 /StoreManager/Create.
下一步,我们特意输入一些破坏验证规则的数据,在价格字段中输入 0, 将标题字段的内容保留为空白,当我们点击创建的时候,我们将会看到表单中不符合验证规则的字段显示了验证的错误提示信息。
测试客户端验证
对于应用程序来说,服务器端验证非常重要,因为用户可能绕过了客户端验证,实际上,Web 页面仅仅实现服务器端验证存在三个显著的问题:
- 在提交表单的时候,用户必须等待,验证在服务器端进行,需要将验证的结果发送回浏览器。
- 用户不能在输入错误的时候立即得到回应,以便通过验证规则的检查。
- 我们把可以在浏览器完成的工作交给了服务器,浪费了服务器的资源。
幸运的是,ASP.NET MVC3 支架模板还提供了内建的客户端验证,不需要我们做额外的工作就可以使用。
在必须输入的标题字段中输入一个字符,验证的错误提示信息立即就消失了。
这里,我们要注意几点:
页面中已经引用了 jQuery 的脚本。
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
在 web.config 中,已经默认支持了客户端验证。
<appSettings>
<add key="ClientValidationEnabled" value="true"/>
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>
</appSettings>