当前位置: 首页 > news >正文

C# Web开发教程(十二)数据校验机制

内置数据校验机制

  • 框架内置了对数据校验的支持
- 在System.ComponentModel.DataAnnotations这个命名空间下:- 比如[Required]、[EmailAddress] 、[RegularExpression] 、 CustomValidationAttribute、IValidatableObject等待
  • demo演示
// LoginRequest1.csusing System.ComponentModel.DataAnnotations;namespace WebApplicationAboutDataValidate
{public class LoginRequest1{[Required][EmailAddress][RegularExpression("^.*@(qq|163)\\.com$", ErrorMessage = "只支持QQ和163邮箱")]public string Email { get; set; }[Required][StringLength(10, MinimumLength = 3)]public string Password { get; set; }[Compare(nameof(Password2), ErrorMessage = "两次密码必须一致")]public string Password2 { get; set; }}
}
  • 测试效果
- 提交如下字段{"email": "user@example.com","password": "string","password2": "string"
}- 返回:{"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1","title": "One or more validation errors occurred.","status": 400,"traceId": "00-840f868ea1c247a51f659d0092a68ae9-a7f61df6b9a99cd3-00","errors": {"Email": ["只支持QQ和163邮箱"]}
}- 提交如下字段:{"email": "user@qq.com","password": "string123","password2": "string"
}- 返回:{"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1","title": "One or more validation errors occurred.","status": 400,"traceId": "00-e635ad8de5684008becbe67b9be814e8-fea276f49eca5228-00","errors": {"Password2": ["两次密码必须一致"]}
}
  • 内置数据校验机制的问题点
- 校验规则都是和模型类耦合在一起,违反“单一职责原则”;
- 很多常用的校验都需要编写自定义校验规则,而且写起来麻烦。

数据校验机制第三方库--- FluentValidation1

  • FluentValidation在很多项目中都可以使用(比如WinForm,WPF)

  • 注意事项: FluentValidation可以和内置的数据校验机制混用,但最好不要这么干,避免混淆和未知的坑.

  • 安装库

- Install-Package Microsoft.EntityFrameworkCore.Tools -Version 6.0.0
-  Install-Package FluentValidation.AspNetCore -Version 10.3.4 // 这里不要搞成6的版本,有坑
  • Program.cs注册一下
// LoginRequest1.cs
using System.ComponentModel.DataAnnotations;namespace WebApplicationAboutDataValidate
{public class LoginRequest1{public string Email { get; set; }public string UserName { get; set; }public string Password { get; set; }public string Password2 { get; set; }}
}// AddNewUserRequestValidator.cs---自定义校验器using FluentValidation;namespace WebApplicationAboutDataValidate
{public class AddNewUserRequestValidator : AbstractValidator<LoginRequest1>{public AddNewUserRequestValidator(){RuleFor(x => x.Email).NotNull().EmailAddress().WithMessage("邮箱必须是合法地址").Must(x => x.EndsWith("@163.com") || x.EndsWith("@qq.com")).WithMessage("支持163或者QQ邮箱");RuleFor(x => x.UserName).NotNull().Length(3,10);RuleFor(x => x.Password).Equal(x => x.Password2).WithMessage("两次密码必须一致");}}
}// Program.cs
......
builder.Services.AddSwaggerGen();
// 注册全局验证器
builder.Services.AddFluentValidation(fv => {Assembly assembly = Assembly.GetExecutingAssembly();fv.RegisterValidatorsFromAssembly(assembly);
});
var app = builder.Build();
......// 测试接口using Microsoft.AspNetCore.Mvc;namespace WebApplicationAboutDataValidate.Controllers
{[ApiController][Route("[controller]/[action]")]public class ValidateDataController : ControllerBase{[HttpPost]public ActionResult Login(LoginRequest1 req){return Ok(req);}}
}
- 测试: https://localhost:7263/ValidateData/Login{"email": "string","userName": "string","password": "string","password2": "string111"
}- 返回结果{"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1","title": "One or more validation errors occurred.","status": 400,"traceId": "00-7666f45f49e7afcab428d6bbd34d5bfb-1d6ed200ab8f73e3-00","errors": {"Email": ["邮箱必须是合法地址","支持163或者QQ邮箱"],"Password": ["两次密码必须一致"]}
}
  • FluentValidation + DI高级功能---依赖注入: 可以通过构造方法来向校验器注入服务
using FluentValidation;
using Microsoft.AspNetCore.Identity;namespace WebApplicationAboutDataValidate
{public class AddNewUserRequestValidator : AbstractValidator<LoginRequest1>{public AddNewUserRequestValidator(UserManager<LoginRequest1> userManager){RuleFor(x => x.Email).NotNull().EmailAddress().WithMessage("邮箱必须是合法地址").Must(x => x.EndsWith("@163.com") || x.EndsWith("@qq.com")).WithMessage("支持163或者QQ邮箱");RuleFor(x => x.UserName).NotNull().Length(3,10).MustAsync(async (x,_) => await userManager.FindByNameAsync(x) == null).WithMessage("用户名已存在");//RuleFor(x => x.Password).Equal(x => x.Password2).WithMessage("两次密码必须一致");RuleFor(x => x.Password).Equal(x => x.Password2).WithMessage(x => $"密码{x.Password}和{x.Password2}不一致");}}
}

核心要点总结

  1. 分离关注点:FluentValidation 将校验逻辑从模型类中分离出来
  2. 链式编程:使用流畅的接口设计,代码可读性更强
  3. 灵活性强:支持复杂的业务逻辑校验,包括异步校验
  4. 错误信息定制:可以灵活定制错误消息,支持动态消息
  5. 依赖注入支持:可以在校验器中注入服务,实现更复杂的业务校验
http://www.jsqmd.com/news/31194/

相关文章:

  • 2025 年 11 月碳纤维铣刀源头厂家口碑推荐榜:高精度碳纤维铣刀,复合材料专用铣刀,CNC 加工铣刀厂家精选,助力高效切削与优质加工!
  • mssql db_owner权限sql注入
  • supervosor 进程管理
  • pikachu靶场 sql注入
  • 2025年垃圾桶加工厂权威推荐榜单:智能回收箱/分类垃圾桶/户外垃圾桶源头厂家精选
  • 关于AI上下文工程重塑人机协作的 5 个颠覆性认知
  • java基础-12 : 单列集合(Collection) - 指南
  • 查看GPU显卡架构及计算能力
  • java基础-12 : 单列集合(Collection) - 详解
  • 2025 年 11 月 ESB 集成平台,API 管理集成平台,集易云集成平台公司最新推荐,聚焦资质、案例、售后的五家机构深度解读!
  • 三场比赛(四)
  • mssql public权限sql注入
  • 2025 年 11 月 SAP 集成平台,EDI 集成平台,ERP 集成平台公司最新推荐,聚焦资质、案例、售后的五家机构深度解读!
  • Luogu P11361 [NOIP2024] 编辑字符串 题解
  • AI辅助编程下的软件分层设计:让生成的代码井然有序
  • 2025年钢管总成加工厂权威推荐榜单:液压钢管总成/硬管总成品牌/免焊接钢管总成源头厂家精选
  • 2025年变电站接地线定做厂家权威推荐榜单:便携型接地线/单簧卡口接地线/电厂专用接地线源头厂家精选
  • 关于Dify工作流的项目实现与思考
  • 2025年河北搬家渠道权威推荐榜单:河北单位搬迁/河北搬运小时工/河北大型设备搬运服务精选
  • 2025年顶尖候车亭/公交站台//电子站牌/公交站牌/公交候车厅厂家: 江苏兰太城市科技领跑
  • 华为高斯Gauss数据库版本与兼容协议--详解(附带Gorm连接示例代码) - 教程
  • 任务栏图标变空白
  • 2025年酒店剃须刀生产厂家权威推荐榜单:一次性剃须刀套装/女士刮毛刀/刮胡刀供应商精选
  • 打开word或PDF,在同目录下自动生成debug.log文件,文件大小0字节!最后发现竟然是一个时时刻刻都要用到的软件引起的
  • 2025年铸铁修正轮企业权威推荐榜单:丸片修正轮/金刚石丸片修正轮/镀砂修正轮源头厂家精选
  • 西南地区钢结构工程设计施工服务TOP5推荐:钢结构工程设计服务商哪个靠谱
  • 2025年防水卷材供应商权威推荐榜单:防水涂料/堵漏材料/外墙防水涂料源头厂家精选
  • 2025年不锈钢门定制工厂排名,不锈钢酒柜定制公司推荐
  • 1000UserGuide:独立开发者获取前1000个用户的终极指南
  • 2025年不锈钢家具定制工厂推荐:5家靠谱专业不锈钢机构全解析