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

ASP.NET Core数据校验FluentValidation

内置数据校验机制

  1. .NET Core中内置了对数据校验的支持,在System.ComponentModel.DataAnnotations这个命名空间下,比如[Required]、[EmailAddress] 、[RegularExpression]。CustomValidationAttribute、IValidatableObject。
  2. 内置的校验机制的问题:校验规则都是和模型类耦合在一起,违反“单一职责原则”;很多常用的校验都需要编写自定义校验规则,而且写起来麻烦。

FluentValidation

ASP.NET Core — FluentValidation 文档https://docs.fluentvalidation.net/en/latest/aspnet.html

用类似于EF Core中Fluent API的方式进行校验规则的配置,也就是我们可以把对模型类的校验放到单独的校验类中。

  1. NuGet:Install-Package FluentValidation
  2. 在Program.cs中注册服务
    //注册当前程序集所有Validator
    builder.Services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly());
    //注册指定程序集所有Validator
    //builder.Services.AddValidatorsFromAssembly(Assembly.Load(""));
  3. 创建NewPerson类
    public record NewPerson
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Password { get; set; }
        public int Age { get; set; }
        public string Email  { get; set; }
    }
  4. 创建一组验证规则NewPersonValidator类,继承自AbstractValidator<NewPerson>
    public class NewPersonValidator : AbstractValidator<NewPerson>
    {
        public NewPersonValidator()
        {
            RuleFor(x => x.Name).NotEmpty().MaximumLength(50).WithMessage("姓名不能为空")
                .MustAsync(async (x, _) => await Task.FromResult(1 == 1))
                .WithMessage(x=>$"用户名{x.Name}已存在");
            RuleFor(x => x.Age).InclusiveBetween(1, 200).WithMessage("年龄必须在1-200之间");
            RuleFor(x => x.Password).NotNull().WithMessage("密码不能为空").Length(6, 10).WithMessage("密码为6-9位");
            RuleFor(x => x.Email).NotNull().EmailAddress().WithMessage("邮箱格式不正确")
                .Must(o => o.EndsWith("@qq.com") || o.EndsWith("@163.com"))
                .WithMessage("只支持163和QQ邮箱");
        }
    }
  5. 手动验证
     
    [Route("api/[controller]/[action]")]
    [ApiController]
    public class DemoController : ControllerBase
    {
        private readonly IValidator<NewPerson> Validator_Person;
    
        public DemoController(IValidator<NewPerson> validator_Person)
        {
            Validator_Person = validator_Person;
        }
    
        [HttpGet]
        public async Task<IActionResult> Person(NewPerson p)
        {
            //手动验证
            var validationResult = await Validator_Person.ValidateAsync(p);
            return Ok(validationResult);
        }
    }


http://www.kler.cn/a/539149.html

相关文章:

  • 非递减子序列(力扣491)
  • 利用UNIAPP实现短视频上下滑动播放功能
  • 【Redis】redis 存储的列表如何分页和检索
  • 网络防御高级02-综合实验
  • 15vue3实战-----props和emit传值
  • 计算机网络应用层:模型、系统与协议全解析!!!
  • 车联网技术在智能交通系统中的设计与实现(论文+源码)
  • “图像识别分割算法:解锁视觉智能的关键技术
  • 【c++】面向过程 面向对象
  • 苍穹外卖-菜品分页查询
  • C# 多线程应用(同步异步)
  • 《 C++ 点滴漫谈: 二十六 》控制流艺术:如何在 C++ 中驾驭程序逻辑
  • 深入讲解MyBatis
  • 启用MFA增强安全性防范勒索病毒
  • [AI]Mac本地部署Deepseek R1模型 — — 保姆级教程
  • TypeScript语言的多线程编程
  • 国产编辑器EverEdit - Web预览功能
  • DeepSeek繁忙时的最佳平替:阿里通义千问Qwen2.5-Max
  • 堆详解及C语言实现
  • (1/100)每日小游戏平台系列
  • React中使用​​useReducer​​​高阶钩子来管理状态
  • <论文>DeepSeek-R1:通过强化学习激励大语言模型的推理能力(深度思考)
  • Julia语言的安全开发
  • 德温特专利数据库字段说明
  • Leetcode面试经典150题刷题记录 —— 二分查找篇
  • 尝试一下,交互式的三维计算python库,py3d