作者:Jon Galloway
MVC 音乐应用商店是一个教程应用程序,介绍和说明如何使用 ASP.NET MVC 和 Visual Studio 进行 Web 开发。
MVC 音乐商店是一种轻型示例商店实现,用于在线销售音乐专辑,并实现基本网站管理、用户登录和购物车功能。
本教程系列详细介绍了生成 ASP.NET MVC 音乐应用商店示例应用程序所执行的所有步骤。 第 6 部分介绍如何使用数据注释进行模型验证。
创建和编辑表单存在一个主要问题:它们不执行任何验证。 我们可以执行诸如将必填字段留空或键入“价格”字段中的字母之类的操作,我们将看到的第一个错误来自数据库。
通过将数据注释添加到模型类,我们可以轻松地向应用程序添加验证。 数据注释允许我们描述要应用于模型属性的规则,ASP.NET MVC 将负责强制实施这些规则并向用户显示适当的消息。
将验证添加到相册表单
我们将使用以下数据注释属性:
- 必需 – 指示属性为必填字段
- DisplayName – 定义要在窗体字段和验证消息上使用的文本
- StringLength – 定义字符串字段的最大长度
- 范围 – 为数值字段提供最大值和最小值
- 绑定 – 列出在将参数或表单值绑定到模型属性时要排除或包括的字段
- ScaffoldColumn – 允许在编辑器窗体中隐藏字段
*注意:有关使用数据注释属性进行模型验证的详细信息,请参阅以下位置的 MSDN 文档:https://go.microsoft.com/fwlink/?LinkId=159063
打开 Album 类,并将以下 using 语句添加到顶部。
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
接下来,更新属性以添加显示和验证属性,如下所示。
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; }
[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; }
}
}
我们在那里时,还将“流派”和“艺术家”修改为虚拟属性。 实体框架可以根据需要对它们进行延迟加载。
public virtual Genre Genre { get; set; }
public virtual Artist Artist { get; set; }
将这些属性添加到相册模型后,“创建和编辑”屏幕会立即开始验证字段,并使用我们选择的显示名称(例如专辑艺术 URL 而不是 AlbumArtUrl)。 运行应用程序并浏览到 /StoreManager/Create。
接下来,我们将违反一些验证规则。 输入价格 0 并将标题留空。 单击“创建”按钮时,将看到显示带有验证错误消息的窗体,其中显示了哪些字段不符合我们定义的验证规则。
测试客户端验证
从应用程序的角度来看,服务器端验证非常重要,因为用户可以规避客户端验证。 但是,仅实现服务器端验证的网页表单显示了三个重大问题。
- 用户必须等待表单在服务器上发布、验证,以及将响应发送到其浏览器。
- 用户更正字段时不会立即获得反馈,即使更正后字段通过了验证规则。
- 我们正在浪费服务器资源来执行验证逻辑,而不是利用用户的浏览器。
幸运的是,ASP.NET MVC 3 基架模板内置了客户端验证,无需执行任何其他工作。
在“标题”字段中键入单个字母符合验证要求,因此会立即删除验证消息。