.Net Core 数据校验框架使用

news2025/1/20 16:25:02

为了提高响应速度和界面可用性,一般在客户端都会对用户填写的数据进行校验,这样不需要把数据发送到服务端,用户就知道数据填写错误。但是也不能完全依赖客户端的校验,不仅因为恶意用户可以绕过客户端校验直接向服务器发送请求,而且服务器端也需要对于客户端开发人员对数据校验不到位的地方做兜底工作。所以,服务器端也应该做数据校验。

.Net Core 框架本身也内置了数据校验,比如必填校验[Require]等,但校验需要写在类本身上,校验规则和模型类具有较高的耦合性,违背单一职责原则,另一方面,内置的校验规则也不够多。

基于以上原因,使用FluentValidation数据校验框架,做数据的校验,下面在.Net Core WebAPI项目中使用框架做数据的校验。

1.创建项目并引用相关的包

fluentvalidation.aspnetcore

2.在Program.cs中添加注册相关服务的代码

builder.Services.AddFluentValidation(fv =>
{
    Assembly assembly = Assembly.GetExecutingAssembly();
    fv.RegisterValidatorsFromAssembly(assembly);
});

RegisterValidatorsFromAssembly方法用于把制定程序集中所有实现了IValidator接口的数据校验类注册到依赖注入容器中。因为本项目所有数据校验类都写到了一个项目中,所以用RegisterValidatorsFromAssembly获取入口项目的程序集。

如果有多个程序集,需要调用RegisterValidatorsFromAssemblies执行这些程序集进行注册。

3.编写模型类

namespace WebApplication1
{
    public record LoginRequest(string Email, string Password, string Password2);
}

4.编写一个数据校验类

using FluentValidation;

namespace WebApplication1
{
    public class LoginRequestVaildator : AbstractValidator<LoginRequest>
    {
        public LoginRequestVaildator()
        {
            RuleFor(x => x.Email).NotNull().EmailAddress()
                .Must(v => v.EndsWith("@qq.com") || v.EndsWith("@163.com"))
                .WithMessage("只支持QQ和163邮箱");

            RuleFor(x => x.Password).NotNull().Length(3, 10)
                .WithMessage("密码必须介于3到10位之间")
                .Equal(x => x.Password2).WithMessage("两次密码必须一致");
        }
    }
}

数据校验类一般集成自AbstractValidator,AbstractValidator是一个泛型类,需要通过泛型参数指定这个数据校验类对哪个类进行校验;校验规则需要写到校验类的构造方法中;

5.编写一个操作方法

        [HttpPost]
        public void dataVaild(LoginRequest login) {
            Console.WriteLine(login.Password);
        }

用LoginRequest作为参数,然后在客户端向这个操作方法对应的路径发送数据。

 

使用FluentValidation后,可以把数据校验的规则写到单独的书校验类中,这样模型类和数据校验类各司其职,符合“单一职责原则”,而且在FluentValidation中编写自定义校验代码也更加简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/556028.html

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

相关文章

YOLOv5区域检测+声音警报

YOLOv5区域检测声音警报 1. 相关配置2. 检测区域设置3. 画检测区域线&#xff08;不想显示也可以不画&#xff09;4. 报警模块5. 代码修改5.1 主代码5.2 细节修改&#xff08;可忽略&#xff09; 6. 实验效果 本篇博文工程源码下载 链接1&#xff1a;https://github.com/up-up-…

图片模块封装

图片模块封装 一.如何更换图片框架二.Glide配置1.依赖&#xff1a; 三.策略模式构建者模式图片框架搭建1.ImageOptions图片参数设置2.IImageLoader接口以及实现子类3.图片加载策略4.ImageLoader5.ImageLoaderManager6.使用:四.Bitmap三级缓存二次采样五.长图大图处理 一.如何更…

华为OD机试真题 Java 实现【任务混部】【2023Q1 200分】

一、题目描述 公司创新实验室正在研究如何最小化资源成本&#xff0c;最大化资源利用率&#xff0c;请你帮他们解决一个任务混部问题&#xff1a; 有taskNum项任务&#xff0c;每个任务有开始时间&#xff08;startTime &#xff09;&#xff0c;结束时间&#xff08;endTime…

Linux系统之cut命令的基本使用

Linux系统之cut命令的基本使用 一、cut命令介绍1. cut命令简介2.cut命令的由来 二、在Linux中命令帮助1. cut的help帮助信息2. cut的选项 三、cut的基本使用1. 指定字段的内容2. 使用分隔符打印文本内容3. 显示行中指定范围的字符 四、cut命令的日常使用1. 提取IP地址2. 提取本…

position:sticky-粘性吸附布局

一、描述 就是在一个滚动的容器里,将一个子元素设置为postion:sticky 在元素显示在可视区域内,显示的效果与position:relative 一致&#xff0c;当元素被滑动出可视区域外是,显示效果与position:fixed一致 二、注意事项 1、父元素需要存在滚动&#xff08;overflow:auto&…

快速入门Springboot整合Datagpa操作数据库

简介SpringDatagpa Spring Data JPA是Spring Data家族的一部分&#xff0c;可以轻松实现基于JPA的存储库。 . JPA是ORM规范&#xff0c;Hibernate是JPA规范的具体实现&#xff0c;这样的好处是开发者可以面向JPA规范进行持久层的开发&#xff0c;而底层的实现则是可以切换的。S…

day5 套接字属性设置

选项的级别 SOL_SOCKET 该级别的选项只作用于套接字本身 SOL_LRLMP 该级别的选项作用于IrDA协议 IPPROTO_IP 该级别的选项作用于IPv4协议 IPPROTO_IPV6 该级别的选项作用于IPv6协议 IPPROTO_RM 该级别的选项作用于可靠的多播传输 IPPROTO_TCP 该级别的选项适用于流式…

信道通信基础 - 传输介质(双绞线、光纤)

文章目录 1 概述2 传输介质2.1 双绞线2.2 光纤 3 扩展3.1 网工软考真题 1 概述 2 传输介质 2.1 双绞线 双绞线&#xff1a;8 根铜导线每 2 根扭在一起&#xff08;百兆用 4 根&#xff0c;千兆必须用 8 根&#xff09;分类 2.2 光纤 光纤&#xff1a;利用光在 玻璃或塑料纤…

很长一段时间没有用Ubuntu,无法获得锁**,锁正由进程***持有

问题分析&#xff1a;意思就是有另一个进程占用了apt-get&#xff0c;因为Ubuntu锁的访问机制是互斥的&#xff0c;即同一时间只能允许一个进程占用&#xff0c;只需要将那个占用的进程强制删除掉就行了。 使用如下两条命令即可&#xff1a; sudo rm /var/lib/dpkg/lock-fron…

藏在大神们收藏夹里的实用工具类网站!

今天来给大家分享几个大神们推荐的&#xff0c;藏在收藏夹里的宝藏工具类网站 Toolfk https://www.toolfk.com/ 一款程序员的工具箱&#xff0c;里面包含非常多实用工具&#xff0c;不仅有各种程序相关功能&#xff0c;还有很多不懂程序人也能用的简易功能。PHP在线加密工具、…

docker-compose 搭建maven私服 nexus与配置

目录 创建文件目录 docker-compose.yml文件 登录 配置 创建阿里云代理仓库 配置仓库顺序 maven配置文件setting.xml配置 本地jar包部署 在linux上搭建 创建文件目录 mkdir -p /apps/minio/{config,data,logs} 赋权限 chmod -R 777 data docker-compose.yml文件 version…

按键中断实验和串口中断实验

目录 【1】按键中断实验 【2】串口中断实验 【1】按键中断实验 实验要求&#xff1a;STM32上电LED&#xff08;PB0&#xff09;灯灭 &#xff0c;当检测到按键&#xff08;PA8&#xff09;按下时处理中断事件&#xff0c;变量i 扩展&#xff1a;知识点 响应优先级-》在两个中断…

Camtasia2023简体中文版屏幕录像 支持MP4/AVI/WMV等多种格式

在现在的网络互联网时代&#xff0c;越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频&#xff0c;也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音&#xff0c;做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

TOGAF架构开发方法—ADM 架构需求管理

一、目标 需求管理阶段的目标是&#xff1a; 确保需求管理流程持续运行&#xff0c;并在所有相关的 ADM 阶段运行管理在 ADM 周期或阶段的任何执行期间确定的架构要求确保在执行阶段时&#xff0c;每个阶段都可以使用相关的体系结构要求 二、输入 需求管理阶段的输入包括&am…

Bean作用域、生命周期

bean作用域如何设置行为模式Bean的生命周期 bean作用域 Bean 的作用域指bean在spring框架的某种行为模式&#xff1b;bean的6种作用域分别是以下&#xff1a; 1&#xff1a;单例&#xff08;Singleton&#xff09;作用域 2&#xff1a;原型&#xff08;Prototype&#xff09;作…

chatgpt赋能Python-python_chardet

Python Chardet: 自动识别文件编码的利器 Python Chardet 是一个用于自动识别文件编码的工具&#xff0c;它基于最新的编码库&#xff0c;可以自动检测多种编码类型。在今天的多语言互联网时代&#xff0c;我们经常需要处理各种编码类型的文件&#xff0c;例如&#xff1a;爬虫…

chatgpt赋能Python-python_calc

介绍 Python Calc 是一款基于 Python 编程语言开发的计算器应用程序。它具备简单易用、功能强大、可扩展性强等特点&#xff0c;广泛应用于数据科学、机器学习、人工智能等领域。 Python Calc 提供了基本算术运算、三角函数、指数函数、对数函数等常用数学运算&#xff0c;同…

chatgpt赋能Python-python_cancel

Python的Cancel&#xff1a;如何有效管理异步操作&#xff1f; 在编写Python应用程序时&#xff0c;异步编程是提高性能和响应能力的重要方式。然而&#xff0c;异步编程会带来一些挑战&#xff0c;如复杂性和不可预测的代码执行顺序。幸运的是&#xff0c;Python提供了一个名…

设计模式-简单Demo掌握责任链模式

文章目录 1、要点2、Demo3、进阶掌握 参考文章&#xff1a; 基本原理&#xff1a;责任链模式 | 菜鸟教程 (runoob.com) 简单例子&#xff1a;五分钟学设计模式.12.责任链模式_哔哩哔哩_bilibili 阿里巴巴的应用&#xff1a;责任链模式在复杂数据处理场景中的实战 责任链模式&am…