本篇文章我们学习如何给 Book实体类添加校验规则。当用户进行创建或编辑书籍信息时,都会触发校验规则。
一、校验
软件开发中有一个主要原则被称为 DRY(即“不要自我重复”)。 Razor 页面鼓励进行只需要开发一次,这个功能就能在整个应用中使用,不需要重复开发,或复制粘贴。 DRY 有助于减少应用中的代码量。 DRY 使代码更加不易出错,且更易于测试和维护。
Razor 页面和 Entity framework框架提供的校验是支持DRY 原则的极佳示例。 校验规则在实体类中的某处以声明方式指定,且在应用程序的所有位置强制执行。
二、在书籍实体类中添加校验规则
在Visual Studio 2017的解决方案资源管理器中,打开 ModelsBook.cs 文件。 DataAnnotations 提供一组内置的校验规则特性,我们可以通过声明的方式应用于类或属性之上。 DataAnnotations 还包含 DataType 等格式特性,有助于格式设置但不提供验证。
现在我们来给Book 类使用 Required、StringLength、Regularexpression 和 Range 校验规则特性,代码如下所示。
using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.Linq;using System.Threading.Tasks;
namespace RazorMvcBooks.Models
{ public class Book
{
public int ID { get; set; }
[Required]
[StringLength(50, MinimumLength = 2)] public string Name { get; set; }
[Display(Name = "出版日期")]
[DataType(DataType.Date)]
public DateTime ReleaseDate { get; set; }
[Range(1,200)]
[DataType(DataType.Currency)] public decimal Price { get; set; }
[Regularexpression(@"^[A-Z]+[a-zA-Z""'s-]*$"), Required, StringLength(30)] public string Author { get; set; }
[Required] public string Publishing { get; set; }
}
}
校验特性用在实体类的属性上,并且将前端强制执行。
Required 和 MinimumLength 特性表示属性必须具有一个值。 但是,用户可以随时输入空格对可以为 null 的类型进行校验约束。 从本质上来说,对于不能为 null 的值类型(如 decimal、int、float 和 DateTime),可以不添加 Required 特性。
Regularexpression 特性限制用户可以输入的字符。 在上述代码中, Rating 只能输入字母(禁用空格、数字和特殊字符)。
Range 特性将值限制在指定范围内。
StringLength 特性设置字符串的最大长度,且可视情况设置最小长度。
让 ASP.NET Core 强制自动执行校验规则有助于提升应用程序的可靠性。 在实体类上进行自动校验助于保护应用程序,因为添加新代码时无需手动修改旧代码。
三、查看面中的校验信息在Visual Studio 2017中按F5运行应用程序,并在浏览器中浏览到书籍列表页面。
在书籍列表页面,使用鼠标左键点击“Create”链接。在新建页面中的输入框中输入一些无效值。当jQuery客户端校验检测到错误时,它会显示一条错误消息。 如下图。
备注
你可能无法在 Price 字段中输入小数点或逗号。 若要使 jQuery 校验支持非英英语环境中使用逗号(“,”)表替小数点,以及使用非美式英语日期格式,你必须采取应用全球化设置来改变你的应用程序。
请注意,表单在包含无效值的每个字段下自动呈现一个适当的校验错误消息。错误包括客户端(使用 Javascript 和 jQuery )和服务器端(当用户禁用Javascript时)。
一项重要好处是,无需在“创建”或“编辑”页面中更改代码。 一量在在实体类上应用 DataAnnotations 后,即已启用校验UI。 本教程中自动创建的 Razor 页面自动选取了校验规则(使用Book类的属性上的校验特性)。 使用“编辑”页面测试验证后,所有应用这个Book类的页面都应用了相同校验规则。
存在客户端验证错误时,不会将表单数据提交到后台服务器。 你可以使用以下一种或多种方法验证是否未发布表单数据:
1) 在 onPostAsync 方法中放置一个断点。 提交表单(选择“Create”或“Save”)。 从未命中断点。
2) 使用 Fiddler 工具。
3) 使用浏览器开发人员工具监视网络流量。
四、服务器端验证
首先我们在浏览器中禁用 Javascript,即不进行客户端校验,然后把有错误的数据提交到后台服务器。
测试服务器端验证:
1. 在浏览器中禁用 Javascript。 如果你的浏览器中无法禁用 Javascript,请试试其他浏览器。
2. 在“新建”或“编辑”页面的 onPostAsync 方法中设置断点。
3. 提交带有不符全校验规则的表单数据。
4. 查看一下OnPostAsync方法中是否有以下代码。
if (!ModelState.IsValid)
{ return Page();
} 5. 结果如下图。
以下代码显示了之前在本教程中设定其基架的“Create.cshtml”的一部分。 它用于在“创建”和“编辑”页面中显示初始表单并在发生错误后重新显示表单。



