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

news/2025/11/4 14:44:13/文章来源:https://www.cnblogs.com/qinganning/p/19190293

内置数据校验机制

  • 框架内置了对数据校验的支持
- 在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.mzph.cn/news/955694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年宁夏越南专线运输平台权威推荐榜单:新疆中越专线物流/北京越南货运/天津越南国际物流源头公司精选

随着中国—东盟自由贸易区升级及RCEP协定深化,中越跨境物流需求显著增长。2024年,中越双边贸易额突破2000亿美元,同比增长18.5%,其中宁夏经云南、广西至越南的货运量年均增速达25%。本文将结合运输时效、通关能力、…

2025 年 11 月碳纤维铣刀源头厂家口碑推荐榜:高精度碳纤维铣刀,复合材料专用铣刀,CNC 加工铣刀厂家精选,助力高效切削与优质加工!

2025 年 11 月碳纤维铣刀源头厂家口碑推荐榜:高精度碳纤维铣刀,复合材料专用铣刀,CNC 加工铣刀厂家精选,助力高效切削与优质加工! 随着先进制造业的快速发展,碳纤维复合材料在航空航天、汽车工业、精密电子等领域…

mssql db_owner权限sql注入

第一步 查看当前网站是否为db_owner 权限 http://192.168.152.129:85/1.aspx?xxser=1 and 1=(select is_member(db_owner) );-- 判断当前数据库用户是否为db_owner 权限 没报错 有权限第二步 执行一些报错语句 找路…

supervosor 进程管理

supervosor 进程管理简介 定义:Supervisor是用Python开发的一套通用的进程管理程序 功能:能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启 管理方式:它是通过fork/exec的方式把这些…

pikachu靶场 sql注入

数字型注入(post) 打开burpsuite 用内置浏览器访问靶场==>点击 open browser ==>点击intercept==> intercept on 抓取数据包右键 ==> send to repeater找到repeater 查看数据包 id改为2试一下 也能查到…

2025年垃圾桶加工厂权威推荐榜单:智能回收箱/分类垃圾桶/户外垃圾桶源头厂家精选

随着城市化进程加快和环保意识提升,垃圾桶作为城市基础设施与家庭必备品,市场需求持续增长。根据行业数据显示,2024年我国垃圾桶年产量突破8500万只,其中塑料材质占比62%,金属材质占比28%,智能分类产品增速达35%…

关于AI上下文工程重塑人机协作的 5 个颠覆性认知

关于AI上下文工程重塑人机协作的 5 个颠覆性认知关于AI上下文工程重塑人机协作的 5 个颠覆性认知 宝子们,AI界的大瓜来了!GAIR团队刚发布了Context Engineering 2.0,这可完全颠覆了我们对人机交互的认知。以前我…

java基础-12 : 单列集合(Collection) - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

查看GPU显卡架构及计算能力

查看GPU显卡架构及计算能力查看GPU显卡架构及计算能力:nvidia-smi --query-gpu=name,compute_cap --format=csv输出示例: name, compute_capNVIDIA RTX A5000, 8.6NVIDIA H100, 9.0 Compute Capability(计算能力)对…

java基础-12 : 单列集合(Collection) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月 ESB 集成平台,API 管理集成平台,集易云集成平台公司最新推荐,聚焦资质、案例、售后的五家机构深度解读!

引言 随着企业数字化转型进入深水区,ESB 集成平台、API 管理集成平台、集易云集成平台的市场需求持续攀升。为帮助企业精准筛选优质服务商,行业协会联合专业测评机构开展了 2025 年度专项测评,通过 “资质审核 - 技…

三场比赛(四)

摘要。0.前言 NOIP 模拟赛。 1.正文 2.总结

mssql public权限sql注入

第一 查看数据库库名 http://192.168.152.129:85/1.aspx?xxser=1 and 1=(select db_name()) http://192.168.152.129:85/1.aspx?xxser=1 and 1=(select db_name(1)) http://192.168.152.129:85/1.aspx?xxser=1 and …

2025 年 11 月 SAP 集成平台,EDI 集成平台,ERP 集成平台公司最新推荐,聚焦资质、案例、售后的五家机构深度解读!

引言 随着企业数字化转型的深入,SAP 集成平台、EDI 集成平台、ERP 集成平台的需求持续攀升,选择优质公司成为企业提升运营效率的关键。本次推荐基于行业权威协会测评数据,测评涵盖资质认证、技术方案适配性、项目案…

Luogu P11361 [NOIP2024] 编辑字符串 题解

SolutionLink。 观察题。一个有趣的事实是题解中提到的所有错解我还真都想过一次,比如贪心 pick 最长的连续 \(1\) 段以及尝试合并上下连续的 \(1\) 段。这题的数据范围和特殊性质做的不错,顺着来想比较好考虑问题。…

AI辅助编程下的软件分层设计:让生成的代码井然有序

在人工智能(AI)辅助编程日益普及的今天,我们编码的方式正在经历一场前所未有的变革。 AI 工具如 QWenCoder,TreaCN等,能够帮助我们快速生成代码,极大地提升了开发效率。 然而,这也带来了一个新的挑战: 如何确保…

2025年钢管总成加工厂权威推荐榜单:液压钢管总成/硬管总成品牌/免焊接钢管总成源头厂家精选

在工业装备与流体传输系统日益精密的今天,一套高品质的钢管总成已成为保障系统安全与稳定运行的关键环节。 钢管总成作为工业设备中传递介质、连接系统的核心部件,其质量直接影响整个系统的可靠性与寿命。为帮助您精…

2025年变电站接地线定做厂家权威推荐榜单:便携型接地线/单簧卡口接地线/电厂专用接地线源头厂家精选

在电力安全标准持续升级的背景下,变电站接地线作为保障电力作业安全的关键设备,其定制化市场需求显著增长。据2025年电力行业安全器具分析报告显示,中国变电站接地线市场规模已达86亿元,年增长率稳定在18%以上。 随…

关于Dify工作流的项目实现与思考

最近公司搭建基于DIFY的工作流,参与了部分工作,记录一下所思所想。 1、项目应用的关键技术有:.NET、Python、DIFY 2、.NET作为公司代码语言,提供工作流所需的所有的查询接口 3、Python用来实现Dify和.Net和钉钉之间…

2025年河北搬家渠道权威推荐榜单:河北单位搬迁/河北搬运小时工/河北大型设备搬运服务精选

在京津冀协同发展持续深化的背景下,一次专业可靠的搬家服务已成为企业高效运营和家庭顺利乔迁的重要保障。 作为物流行业的重要组成部分,搬家服务的专业性与可靠性直接影响着企业和居民的搬迁体验与效率。据2024年行…