闲话 ASP.NET Core 数据校验(二):FluentValidation 基本用法

news/2024/5/17 18:09:38

image

前言

除了使用 ASP.NET Core 内置框架来校验数据,事实上,通过很多第三方框架校验数据,更具优势。
比如 FluentValidation,FluentValidation 是第三方的数据校验框架,具有许多优势,是开发人员首选的数据校验工具之一。
以下列举 FluentValidation 的一些优势:

  1. FluentValidation 使用 Fluent 方式配置校验规则,通过链式调用方法,使得编写校验规则变得非常直观和易于理解,可以轻松地构建复杂的校验规则
  2. FluentValidation 内置更多的校验规则,可以满足各种复杂的数据校验需求
  3. FluentValidation 更方便扩展自定义规则,实现校验逻辑的重用,提高代码的可维护性和复用性
  4. FluentValidation 与 ASP.NET MVC、ASP.NET Core、Web API 等框架无缝集成,数据校验和验证可以轻松地与应用程序的其他部分进行交互
  5. FluentValidation 支持根据具体的校验规则和场景来定义更加友好和具体的错误消息,提高用户体验
  6. FluentValidation 的校验规则更容易进行单元测试

Step By Step 步骤

  1. 创建一个 Asp.Net Core WebApi 项目

  2. 引用以下 Nuget 包

    FluentValidation.AspNetCore

  3. 创建 Login 操作方法的请求参数模型类 LoginRequest

    // LoginRequest 类只是一个普通的 C# 类,
    // 没有标注任何的 Attribute 或者实现任何的接口,
    // 它的唯一责任就是传递数据
    public record LoginRequest(string Email, string Password, string PasswordConfirm);
    
  4. 编写继承自AbstractValidator的数据校验类,留意注释

    using FluentValidation;// 数据校验类要继承自 AbstractValidator
    // 通过 AbstractValidator 的泛型参数指定对哪个类进行校验
    public class LoginRequestValidator: AbstractValidator<LoginRequest>
    {// 校验规则写到校验类的构造方法中public LoginRequestValidator(){// 通过RuleFor来指定要对哪个属性进行校验// 多个校验规则可以采用链式调用的写法// 每个需要校验的属性对应一组RuleFor调用RuleFor(x => x.Email).NotNull().EmailAddress()// 在Must方法中编写自定义校验规则,.Must(v => v.EndsWith("@qq.com") || v.EndsWith("@163.com"))// 通过WithMessage方法自定义报错信息,// WithMessage方法设置的报错信息只作用于它之前的那个校验规则.WithMessage("只支持QQ和163邮箱");RuleFor(x => x.Password).NotNull().Length(3, 10).WithMessage("密码长度必须介于3到10之间").Equal(x => x.PasswordConfirm).WithMessage("两次密码必须一致");}
    }
    
  5. 打开 Program.cs,注册 FluentValidation 服务

    using FluentValidation;
    using FluentValidation.AspNetCore;
    using System.Reflection;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();Assembly assembly = Assembly.GetExecutingAssembly();
    builder.Services.AddFluentValidationAutoValidation().AddFluentValidationClientsideAdapters().AddValidatorsFromAssembly(assembly);
    var app = builder.Build();// Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {app.UseSwagger();app.UseSwaggerUI();
    }app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();	
    
  6. 打开登录请求控制器,编写 Login API

    using Microsoft.AspNetCore.Mvc;namespace FluentValidationSample.Controllers
    {[ApiController][Route("[controller]/[action]")]public class TestController : ControllerBase{[HttpPost]public ActionResult Login(LoginRequest req){return Ok();}}
    }
    

总结

  1. FluentValidation 把数据校验的规则写到单独的数据校验类中,这样模型类和数据校验类各司其职,符合 “单一职责原则”
  2. 在 FluentValidation 中编写自定义校验代码更加简单
  3. FluentValidation 和 .NET Core 内置的校验方式是可以共存的,也就是可以一部分校验规则用 FluentValidation 写,另一部分校验规则用 .NET Core 内置的校验方式写(不建议)。

http://www.mrgr.cn/p/81338817

相关文章

打印机-STM32版本 硬件部分

最终PCB EDA工程: 一、确定芯片型号 根据项目需求&#xff0c;梳理需要用到的功能&#xff0c; 电量检测&#xff1a;ADC 按键&#xff1a;IO input外部中断 LED&#xff1a;IO output 温度检测&#xff1a;ADC 电机控制&#xff1a;IO output 打印通讯&#xff1a;SPI …

分布式与一致性协议之Paxos算法(三)

Paxos算法 兰伯特关于Multi-Paxos的思考 领导者 我们可以通过引入领导者(Leader)节点来解决第一个问题。也就是说将领导者节点作为唯一提议者&#xff0c;如图所示。这样就不存在多个提议者同时提交提案的情况&#xff0c;也就不存在提案冲突的情况了。这里补充一点:在论文中…

springboot整合knfi4j

1.pom文件添加依赖 <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-spring-boot-starter</artifactId><version>3.0.3</version></dependency>2.配置knfi4j @Configuration @EnableSwagger2 @Enable…

mac M2 配置item2 rzsz

背景 apple m 系列处理器安装的 homebrew 跟 intel 处理器略有不同&#xff0c;其中安装目录的区别&#xff1a; m 系列处理器安装目录为 /usr/local/bin/homebrew intel 处理器安装目录为 /opt/homebrew 问题1: 卡住 产生原因&#xff1a; m 系列使用 brew install lrzs…

Delta模拟器:iOS上的复古游戏天堂

Delta模拟器&#xff1a;iOS上的复古游戏天堂 在数字时代&#xff0c;我们有时会怀念起那些早期的电子游戏&#xff0c;它们简单、纯粹&#xff0c;带给我们无尽的乐趣。虽然现在的游戏在画质和玩法上都有了巨大的提升&#xff0c;但那种复古的感觉却始终无法替代。幸运的是&a…

06_电子设计教程基础篇(学习视频推荐)

文章目录 前言一、基础视频1、电路原理3、模电4、高频电子线路5、电力电子技术6、数学物理方法7、电磁场与电磁波8、信号系统9、自动控制原理10、通信原理11、单片机原理 二、科普视频1、工科男孙老师2、达尔闻3、爱上半导体4、华秋商城5、JT硬件乐趣6、洋桃电子 三、教学视频1…

github在开启双因素认证后无法push

github在开启了双因素认证后,无法push代码 解决办法 1.打开github,点击右上角头像,点击setting2.选择左边菜单最右下角的Developer Settings3.点击 Person access tokens,选择第二个,Tokens(classic)4.创建一个token,可以选择过期时间和权限,如果是个人使用,直接选择不过期,勾上…

向量的旋转矩阵

我们都知道&#xff0c;矩阵的乘法可以表示旋转。那么&#xff0c;这一理论的数学机理是什么呢&#xff1f;以及&#xff0c;这个旋转角度该怎么用矩阵表示呢&#xff1f; 本文用二维向量旋转来推导旋转矩阵的公式。假设&#xff0c;我们有一个向量P(x, y)&#xff0c;准备通过…

C语言-调试技巧

目录 一、调试介绍1.1 Debug和Release的介绍1.2 Windows环境调试介绍1.2.1 学会快捷键1.2.2 查看临时变量的值1.2.3 查看内存信息1.2.4 查看调用堆栈1.2.4 查看汇编信息1.2.5 查看寄存器信息 二、编程常见的错误2.1 编译型错误2.2 链接型错误2.3 运行时错误 三、易于调试的代码…

PEI是聚醚酰亚胺(Polyetherimide)主要作用是什么?

PEI是聚醚酰亚胺&#xff08;Polyetherimide&#xff09;主要作用是什么&#xff1f; 聚醚酰亚胺&#xff08;Polyetherimide&#xff0c;PEI&#xff09;作为一种高性能的工程塑料&#xff0c;具有多种优异的性能&#xff0c;因此在不同领域中有广泛的应用。其主要作用包括&…

Visual Studio安装MFC开发组件

MFC由于比较古老了&#xff0c;Visual Studio默认没有这个开发组件。最近由于一些原因&#xff0c;需要使用这个库&#xff0c;这就需要另外安装。 参考了网上的一些资料&#xff0c;根据实际使用&#xff0c;其实很多步骤不是必须的。 https://zhuanlan.zhihu.com/p/68117276…

【Scala---01】Scala『 Scala简介 | 函数式编程简介 | Scala VS Java | 安装与部署』

文章目录 1. Scala简介2. 函数式编程简介3. Scala VS Java4. 安装与部署 1. Scala简介 Scala是由于Spark的流行而兴起的。Scala是高级语言&#xff0c;Scala底层使用的是Java&#xff0c;可以看做是对Java的进一步封装&#xff0c;更加简洁&#xff0c;代码量是Java的一半。 因…

mysql刷题题后感

刷题的时候会将一些题目收藏,也会收藏错题,做完了整合一下,会有一些补充知识点。函数篇(和长篇大论的查询有交集) Q1: 查询语句select stuff(lo ina,3, 1, ve ch)结果为?love love china china love china答:stuff,删除并加入字符,STUFF(原字符, 开始位置, 删除长度,…

软件设计师:UML

UML基本概念UML(Unified Modeling Language,统一建模语言) UML词汇表包含3种构造块:事物、关系、图 事物结构事物:静态部分,如类、接口、用例等 行为事物:动态部分,如交互、状态机、活动 分组事物:包Package 注释事物:注释关系 UML中有4种关系:依赖、关联、泛化、实现…

【Mac】Photoshop 2024 for mac最新安装教程

软件介绍 Photoshop 2024是Adobe公司推出的一款图像处理软件&#xff0c;它支持Windows和Mac OS系统。Adobe Photoshop是业界领先的图像编辑和处理软件之一&#xff0c;广泛用于设计、摄影、数字绘画等领域。 Photoshop 2024的功能包括&#xff1a; 1.图像编辑&#xff1a;提…

react核心知识

1. 对 React 的理解、特性 React 是靠数据驱动视图改变的一种框架&#xff0c;它的核心驱动方法就是用其提供的 setState 方法设置 state 中的数据从而驱动存放在内存中的虚拟 DOM 树的更新 更新方法就是通过 React 的 Diff 算法比较旧虚拟 DOM 树和新虚拟 DOM 树之间的 Chan…

ElasticSearch教程入门到精通——第四部分(基于ELK技术栈elasticsearch 7.x新特性)

ElasticSearch教程入门到精通——第四部分&#xff08;基于ELK技术栈elasticsearch 7.x新特性&#xff09; 1. Elasticsearch进阶1.1 核心概念1.1.1 索引Index1.1.1.1 索引创建原则1.1.1.2 Inverted Index 1.1.2 类型Type1.1.3 文档Document1.1.4 字段Field1.1.5 映射Mapping1.…

linux13-用户,用户组

linux13-用户,用户组需要root权限执行 group add 创建用户组 # 查看含有关键词catcats66的组, 不存在 getent group | catcats66# 添加用户组catcats66 sudo groupadd catcats66 # 查询到含有关键词catcats66的组 getent group | catcats66groupdel 删除用户组 # 删除用户组 gr…

如何用OceanBase的 Load Data 导入CSV文件

0 前言 CSV文件&#xff08;Comma-Separated Values&#xff0c;字符分隔值&#xff09;是一种普遍采用的数据存储格式&#xff0c;有不少企业和机构都用它来进行数据的管理和存储。身为开发者&#xff0c;您可能经常遇到这样的需求&#xff1a;需要将CSV的数据导入OceanBase数…

GPT3 终极指南(一)

原文&#xff1a;zh.annas-archive.org/md5/6de8906c86a2711a5a84c839bec7e073 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 GPT-3&#xff0c;或者说是 Generative Pre-trained Transformer 3&#xff0c;是由 OpenAI 开发的基于 Transformer 的大型语言模型…