学习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]. 如果要求用户必须填写 , 请使用此特性 。
在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; } }}
推荐阅读
- 4 .NET 6学习笔记——如何在.NET 6的Desktop App中使用Windows Runtime API
- Python学习三天计划-3
- 简读《ASP.NET Core技术内幕与项目实战》之3:配置
- 数据科学学习手札145 在Python中利用yarl轻松操作url
- .net core-利用PdfSharpCore和SkiaSharp.QrCode 添加PDF二维码页眉
- 11 微服务架构学习与思考:开源 API 网关02-以 Java 为基础的 API 网关详细介绍
- .net core -利用 BsonDocumentProjectionDefinition 和Lookup 进行 join 关联 MongoDB 查询
- Python学习三天计划-1
- .NET Core C#系列之XiaoFeng.Threading.JobScheduler作业调度
- 10 微服务架构学习与思考:微服务网关和开源 API 网关01-以 Nginx 为基础的 API 网关详细介绍