学习ASP.NET Core Blazor编程系列八——数据校验

学习ASP.NET Core Blazor编程系列一——综述学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(上)学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(中)学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(下)
学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)学习ASP.NET Core Blazor编程系列三——实体学习ASP.NET Core Blazor编程系列四——迁移学习ASP.NET Core Blazor编程系列五——列表页面学习ASP.NET Core Blazor编程系列六——初始化数据学习ASP.NET Core Blazor编程系列七——新增图书在设计应用程序时 , 你应该保持对用户的不信任,虽然你在输入界面上提示了如何正确填写每个值的说明,但必须对他们输入的任何值进行校验 。Blazor 提供了一些简单的校验工具,接下来我们来学习如何配置表单中的输入项,以便正确地校验和响应用户数据 。
验证用户的输入数据
当你收集用户的输入的信息时,必须检查其是否有意义且格式是否正确:

  • 出于业务原因:图书信息(例如价格或库存数量信息)必须正确无误才能为用户提供优质服务 。例如 , 如果在界面中输入库存数量时能立即发现该数据是错误,则可以防止以后付出更高的代价 。
  • 出于技术原因:如果代码使用表单输入进行计算或其他处理,则不正确的输入可能会导致错误和异常 。
  • 出于安全原因:恶意用户可能会试图通过利用未检查的输入框进行代码注入攻击 。
向表单增加校验功能
在软件开发中有一个重要的原则被称为 DRY(即“不要自我重复”) 。Blazor组件鼓励进行只需要开发一次,这个功能就能在整个应用中使用 , 不需要重复开发,或复制粘贴 。DRY 有助于减少应用中的代码量 。DRY 使代码更加不易出错,且更易于测试和维护 。
Blazor组件和 Entity Framework框架提供的DRY原则级别的校验 。校验规则在实体类中的某处以声明方式指定 , 且在应用程序的所有位置强制执行 。
如果看过我的MVC系列,那么肯定了解一个有关校验特性的命名空间,System.ComponentModel.DataAnnotations,DataAnnotations 命名空间下提供一组内置的校验规则特性 , 我们可以通过声明的方式应用于类或属性之上 。
DataAnnotations 命名空间下提供内置校验规则特性如下:
  • [ValidationNever]. 如果要确保该字段从不包含在验证中,请使用此特性 。
  • [CreditCard]. 如果要记录用户的有效信用卡号,请使用此特性 。
  • [Compare]. 如果要确保模型中的两个属性匹配,请使用此特性 。
  • [Phone]. 如果要记录用户的有效电话号码,请使用此特性 。
  • [RegularExpression]. 如果通过将值与正则表达式进行比较来检查值的格式,请使用此特性 。
  • [StringLength]. 如果要检查字符串值的长度是否不超过最大长度,请使用此特性 。
  • [Url]. 如果要记录用户的有效 URL,请使用此特性 。
  • 【学习ASP.NET Core Blazor编程系列八——数据校验】[Required]. 如果要求用户必须填写 , 请使用此特性 。
让 ASP.NET Core Blazor 强制自动执行校验规则有助于提升应用程序的可靠性 。在实体类上进行自动校验助于保护应用程序,因为添加新代码时无需手动修改旧代码 。不要想当然地认为用户知道所有信息:例如,并非每个人都知道有效电子邮件地址的格式 。
在Visual Studio 2022的解决方案资源管理器中,打开 Models\Book.cs 文件 。现在我们来给Book 类使用 Required、StringLength、RegularExpression 和 Range 校验规则特性 , 代码如下所示 。
using System;using System.Collections.Generic;using System.ComponentModel.DataAnnotations;using System.Linq;using System.Threading.Tasks;namespace BlazorAppDemo.Models{    public class Book    {        private string name = String.Empty;       private string author=String.Empty;        [Key]        public int ID { get; set; }        [Required]        [StringLength(50)]        public string Name { get => name; set => name = value; }        public DateTime ReleaseDate { get; set; }        [Required, StringLength(40)]        public string Author { get => author; set => author = value; }        public decimal Price { get; set; }        /// <summary>        /// 图书类型编号        /// </summary>        [RegularExpression(@"^[A-Z]+[a-zA-Z""'\s-]*$"), Required, StringLength(40)]        public string Type { get; set; }        /// <summary>        /// 页码        /// </summary>        public int TotalPages { get; set; }        /// <summary>       /// 库存数量        /// </summary>        [Range(2,30)]       public int StockQty { get; set; }        /// <summary>        /// 已租数量        /// </summary>        public int Qty { get; set; }      }}

推荐阅读