9.3.11 为表单增加验证
在前面的创建专辑与编辑专辑的表单中存在一个问题:即没有进行任何验证。字段的内容可以不输入,或者在价格的字段中输入一些字符,在执行程序的时候,这些错误会导致数据库保存过程中出现错误,显示来自数据库的错误信息。
通过为模型类增加数据描述的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
1.服务器端绑定和验证
打开Album类,首先增加下面的using语句,这些语句引用了DataAnnotations使用的命名空间。代码如下:
然后更新属性,增加显示和验证的DataAnnotations
然后,将专辑Album的属性Genre和Artist设置为虚拟的virtual,这将会使EF-Code First使用延迟加载。
注意:大家可能会想为什么在album类定义上方添加[Bind(Exclude="AlbumId")]语句。回到storeManage控制器的Create方法,可以看到传入的参数只有album,由于在新增album时要验证每一个字段,当然也包括albumID(因为Primary Key不能为Null),但是数据库设计时,albumID又是自动生成的,并且create表单中不能编辑albumID(隐藏)。所以如果不加上[Bind(Exclude="AlbumID")]的话,在执行ModelState.IsValid就会永远都是False而导致无法新增album成功。但是当需要处理的Action一多,麻烦事也就来了,难道每个Action都要加上这个Attribute吗?其实是不用的!只要在类的定义中集中声明一次就可以了,这就是为什么在类定义上加绑定例外。
为专辑修改完成之后,创建和编辑界面立即就会验证字段,并且使用编程者提供的显示名称。运行程序,浏览/StoreManager/Create。这里特意输入一些破坏验证规则的数据,在价格字段中输入0,将标题字段的内容保留为空白,当单击创建的时候,将会看到表单中不符合验证规则的字段显示了验证的错误提示信息,如图9-52所示。
图9-52 表单验证
2.客户端验证
对于应用程序来说,服务器端验证非常重要,因为用户可能绕过了客户端验证,实际上,Web页面仅仅实现服务器端验证存在3个显著的问题:
■在提交表单的时候,用户必须等待,验证在服务器端进行,需要将验证的结果发送回浏览器。
■用户不能在输入错误的时候立即得到回应,以便通过验证规则的检查。
■把可以在浏览器完成的工作交给了服务器,浪费了服务器的资源。
幸运的是,ASP.NET MVC3支架模板还提供了内建的客户端验证,不需要做额外的工作就可以使用。可以采用下面的两种方法轻易地完成客户端验证。
(1)页面中引用jQuery的脚本(自动添加,不需用户编写)
(2)在web.config中修改支持客户端验证。