第 6 部分:使用数据注释进行模型验证

作者: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。

“创建”窗体的屏幕截图,其中显示了“流派和艺术家”下拉列表以及“标题”、“价格”和“专辑艺术 U R L”字段。

接下来,我们将违反一些验证规则。 输入价格 0 并将标题留空。 单击“创建”按钮时,将看到显示带有验证错误消息的窗体,其中显示了哪些字段不符合我们定义的验证规则。

“创建”表单的屏幕截图,显示“标题”和“价格”字段因输入错误而被标记为红色,并附有红色错误信息。

测试客户端验证

从应用程序的角度来看,服务器端验证非常重要,因为用户可以规避客户端验证。 但是,仅实现服务器端验证的网页表单显示了三个重大问题。

  1. 用户必须等待表单在服务器上发布、验证,以及将响应发送到其浏览器。
  2. 用户更正字段时不会立即获得反馈,即使更正后字段通过了验证规则。
  3. 我们正在浪费服务器资源来执行验证逻辑,而不是利用用户的浏览器。

幸运的是,ASP.NET MVC 3 基架模板内置了客户端验证,无需执行任何其他工作。

在“标题”字段中键入单个字母符合验证要求,因此会立即删除验证消息。

“创建”窗体的屏幕截图,其中显示“价格”字段为红色,原因是输入错误和随附的红色错误文本。