.Net Core 数据校验框架使用

news/2024/5/19 21:45:05 标签: .netcore, 数据校验, Fluent, Validation

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

.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.niftyadmin.cn/n/348847.html

相关文章

Linux进程同步机制-Futex

引子 在编译2.6内核的时候&#xff0c;你会在编译选项中看到[*] Enable futex support这一项&#xff0c;上网查&#xff0c;有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序"&#xff0c;那futex是什么&#xff1f;和glibc又有什么关系呢&#xff…

react-naive工作原理

react-naive工作原理是从react的工作原理衍生出来的 react的工作原理 在react中&#xff0c;virtual dom 就像一个中间层&#xff0c;介于开发者描述的视图与实际在页面上渲染的视图之间。为了在浏览器上渲染出可交互的用户界面&#xff0c;开发者必须操作浏览器的Dom&#x…

菜鸡shader:L3三色环境光材质、阴影及光衰

三色环境光材质 先放上最终效果这里将环境光分为上中下三层&#xff0c;顶层是红色的&#xff0c;中间那层是绿色的&#xff0c;下层则是蓝色的。环境光遮蔽效果则是直接采样事先准备好的AO贴图。 首先是上层环境光&#xff1a; 这里我们只需要法线向量的第二个分量&#xf…

【SpringBoot】七:Web服务---Servlet Filter Listener

文章目录 1.Servlet1.1 使用WebServlet创建Servlet1.2 使用编码方式创建Servlet 2.Filter2.1 使用WebFilter创建Filter2.2 使用编码方式创建Filter2.3 Filter排序2.4 使用框架中的 Filter 3. Listener 1.Servlet 1.1 使用WebServlet创建Servlet (1)编写servlet WebServlet(…

Hexo博客查图片并调整位置大小

Hexo博客查图片并调整位置&大小 &#x1f308;Description&#xff1a; ​ Markdown写文章插入图片&#xff0c;在hexo博客中&#xff0c;图片的大小似乎没有按照个markdown的语法生效&#xff0c;本文将解决此问题。 现有问题描述 obsidian中插入图片的语法&#xff1a; !…

高效率工具——chatgpt使用

高效率工具——chatgpt使用 chatgpt是什么 ChatGPT是使用OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型构建的聊天机器人&#xff0c;它可以为用户提供自然语言交互&#xff0c;回答用户的问题或提供有用的信息。该模型训练于大量的文本数据&am…

2024总统大选,成为“关乎比特币未来的公投”?背后是怎样的政治抱负?

在今年的迈阿密比特币大会上&#xff0c;Robert F.Kennedy Jr和Vivek Ramaswamy相继发布声明表示&#xff0c;他们将在2024年初选前接受比特币&#xff08;BTC&#xff09;的捐款。 RFK Jr作为美国前总统约翰肯尼迪的侄子&#xff0c;是第一个公开接受Crypto的总统候选人&#…

[Nginx 发布项目] 打包后的项目,使用nginx发布

前提 &#xff1a;使用的 mars3d 沐瑶大佬 修改后的nginx , - 下载地址 使用的是 Mars3D三维可视化平台 | 火星科技 修改后的 nginx 发布的服务&#xff0c;确保nginx发布服务时正常 &#xff1b; 如果不是&#xff0c;那这里应该没有你想要的答案&#xff1b; 1、直接替换…