Asp .Net Core 集成 FluentValidation 强类型验证规则库

news2025/1/18 10:53:24

文章目录

    • 入门程序
      • 安装
      • 案例:登录
    • 验证器
      • 内置验证器
      • 自定义验证器
        • 编写自定义验证器
        • 可重复使用的属性验证器
    • 本地化
    • DI
    • 自动验证

官网:https://docs.fluentvalidation.net/en/latest/index.html

入门程序

安装

使用 Visual Studio 中的 NuGet 包管理器控制台运行以下命令:

Install-Package FluentValidation

或者从终端窗口使用 .net core CLI:

dotnet add package FluentValidation

案例:登录

编写通用返回类

namespace FluentValidationTest
{
    public class Result
    {
        public string Message { get; set; }

        public int Code { get; set; }

        public dynamic Data { get; set; }

        public static Result Success(dynamic data = null)
        {
            Result result = new Result();
            result.Data = data;
            result.Code = 1;
            result.Message = "success.";
            return result;
        }

        public static Result Fail(string message)
        {
            Result result = new Result();
            result.Code = 0;
            result.Message = message;
            return result;
        }
    }
}

编写登录请求类

using System.ComponentModel;

namespace FluentValidationTest
{
    public class LoginRequest
    {
        [Description("用户名")]
        public string UserName { get; set; }

        [Description("密码")]
        public string Password { get; set; }
    }
}

编写登录请求验证类

using FluentValidation;

namespace FluentValidationTest
{
    public class LoginRequestValidator : AbstractValidator<LoginRequest>
    {
        public LoginRequestValidator()
        {
            RuleFor(x => x.UserName).NotEmpty().WithMessage("用户名不能为空");
            RuleFor(x => x.Password).NotEmpty().WithMessage("密码不能为空");
            RuleFor(x => x.Password).MinimumLength(6).MaximumLength(20).WithErrorCode("-200").WithMessage("密码长度在6-20");
        }
    }
}

编写用户控制器

using FluentValidation.Results;
using Microsoft.AspNetCore.Mvc;

namespace FluentValidationTest.Controllers
{
    [ApiController]
    [Route("[controller]/[action]")]
    public class UserController : ControllerBase
    {
        [HttpPost]
        public async Task<Result> Login(LoginRequest request)
        {
            LoginRequestValidator validations = new LoginRequestValidator();
            //验证
            ValidationResult validationResult = validations.Validate(request);
            if (!validationResult.IsValid)
            {
                return Result.Fail(validationResult.Errors[0].ErrorMessage);
            }
            return Result.Success();
        }
    }
}

测试

image

验证器

内置验证器

网站:https://docs.fluentvalidation.net/en/latest/built-in-validators.html

  • NotNull Validator
  • NotEmpty Validator
  • NotEqual Validator
  • Equal Validator
  • Length Validator
  • MaxLength Validator
  • MinLength Validator
  • Less Than Validator
  • Less Than Or Equal Validator
  • Greater Than Validator
  • Greater Than Or Equal Validator
  • Predicate Validator
  • Regular Expression Validator
  • Email Validator
  • Credit Card Validator
  • Enum Validator
  • Enum Name Validator
  • Empty Validator
  • Null Validator
  • ExclusiveBetween Validator
  • InclusiveBetween Validator
  • PrecisionScale Validator

自定义验证器

编写自定义验证器
            RuleFor(x => x.UserName).Custom((userName, context) =>
            {
                if (!userName.Contains("admin"))
                {
                    context.AddFailure("not amdin.");
                }
            });
可重复使用的属性验证器

在某些情况下,您的自定义逻辑非常复杂,您可能希望将自定义逻辑移至单独的类中。这可以通过编写一个继承抽象类的类来完成 PropertyValidator<T,TProperty>(这是 FluentValidation 的所有内置规则的定义方式)。

using FluentValidation.Validators;
using FluentValidation;

namespace FluentValidationTest
{
    /// <summary>
    /// 条件验证器
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <typeparam name="TProperty"></typeparam>
    public class ConditionValidator<T, TProperty> : PropertyValidator<T, TProperty>
    {
        Func<T, TProperty, bool> _func;

        string _message;

        /// <summary>
        ///
        /// </summary>
        /// <param name="func">委托</param>
        /// <param name="message">提示消息</param>
        public ConditionValidator(Func<T, TProperty, bool> func, string message)
        {
            _func = func;
            _message = message;
        }

        public override string Name => "ConditionValidator";

        public override bool IsValid(ValidationContext<T> context, TProperty value)
        {
            return _func.Invoke(context.InstanceToValidate, value);
        }

        protected override string GetDefaultMessageTemplate(string errorCode)
          => _message;
    }

    /// <summary>
    /// 扩展类
    /// </summary>
    public static class ValidatorExtensions
    {
        public static IRuleBuilderOptions<T, TElement> Condition<T, TElement>(this IRuleBuilder<T, TElement> ruleBuilder, Func<T, TElement, bool> func, string message)
        {
            return ruleBuilder.SetValidator(new ConditionValidator<T, TElement>(func, message));
        }
    }
}

使用

 RuleFor(x => x.UserName).Condition((a, b) => a.UserName.Contains("admin"),"不符合条件");

本地化

如果您想替换 FluentValidation 的全部(或部分)默认消息,则可以通过实现接口的自定义版本来实现 ILanguageManager。

例如,NotNull 验证器的默认消息是。如果您想为应用程序中验证器的所有使用替换此消息,您可以编写一个自定义语言管理器:‘{PropertyName}’ must not be empty.

using FluentValidation.Resources;
using FluentValidation.Validators;

namespace FluentValidationTest
{
    public class CustomLanguageManager : LanguageManager
    {
        public CustomLanguageManager()
        {
            AddTranslation("en", "NotEmptyValidator", "{PropertyName} 值为空");
            AddTranslation("en", "MinimumLengthValidator", "{PropertyName} {PropertyValue} 小于 {MinLength}");
        }

    }
}

Program 类

ValidatorOptions.Global.LanguageManager = new CustomLanguageManager();

DI

https://docs.fluentvalidation.net/en/latest/di.html

Install-Package FluentValidation.DependencyInjectionExtensions

Program.cs添加

            builder.Services.AddValidatorsFromAssemblyContaining<LoginRequestValidator>();
            //builder.Services.AddValidatorsFromAssembly(Assembly.Load("FluentValidationTest"));

控制器实现

    public class UserController : ControllerBase
    {
        private LoginRequestValidator _loginRequestValidator;
        public UserController(LoginRequestValidator loginRequestValidator)
        {
            _loginRequestValidator = loginRequestValidator;
        }
    }

自动验证

https://github.com/SharpGrip/FluentValidation.AutoValidation

安装 nuget 包

Install-Package SharpGrip.FluentValidation.AutoValidation.Mvc

配置

using SharpGrip.FluentValidation.AutoValidation.Mvc.Extensions;

builder.Services.AddFluentValidationAutoValidation(configuration =>
{
    // Disable the built-in .NET model (data annotations) validation.
    configuration.DisableBuiltInModelValidation = true;

    // Only validate controllers decorated with the `FluentValidationAutoValidation` attribute.
    configuration.ValidationStrategy = ValidationStrategy.Annotation;

    // Enable validation for parameters bound from `BindingSource.Body` binding sources.
    configuration.EnableBodyBindingSourceAutomaticValidation = true;

    // Enable validation for parameters bound from `BindingSource.Form` binding sources.
    configuration.EnableFormBindingSourceAutomaticValidation = true;

    // Enable validation for parameters bound from `BindingSource.Query` binding sources.
    configuration.EnableQueryBindingSourceAutomaticValidation = true;

    // Enable validation for parameters bound from `BindingSource.Path` binding sources.
    configuration.EnablePathBindingSourceAutomaticValidation = true;

    // Enable validation for parameters bound from 'BindingSource.Custom' binding sources.
    configuration.EnableCustomBindingSourceAutomaticValidation = true;

    // Replace the default result factory with a custom implementation.
    configuration.OverrideDefaultResultFactoryWith<CustomResultFactory>();
});

自定义返回结果

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using SharpGrip.FluentValidation.AutoValidation.Mvc.Results;

namespace FluentValidationTest
{
    public class CustomResultFactory : IFluentValidationAutoValidationResultFactory
    {
        public IActionResult CreateActionResult(ActionExecutingContext context, ValidationProblemDetails? validationProblemDetails)
        {
            return new JsonResult(Result.Fail(validationProblemDetails.Errors.Values.FirstOrDefault()[0]));
        }
    }
}

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

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

相关文章

maven在pdf转image上的陷阱

在pdf转image上&#xff0c;需要两个插件&#xff1a; <dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.4</version></dependency><dependency><groupId>org.xht…

(2023,提示分布学习,重参数化,正交损失)DreamDistribution:文本到图像扩散模型的提示分布学习

DreamDistribution: Prompt Distribution Learning for Text-to-Image Diffusion Models 公众&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 方法 1.1 文本到图像扩散 1.2 提示…

utf8mb4_0900_ai_ci、utf8mb4_0900_as_ci、utf8mb4_0900_as_cs 这三者有什么区别

utf8mb4_0900_ai_ci, utf8mb4_0900_as_ci, 和 utf8mb4_0900_as_cs 是 MySQL 数据库中使用的字符集和校对规则。这些校对规则决定了如何比较和排序字符数据。它们属于 utf8mb4 字符集&#xff0c;这是 UTF-8 编码的超集&#xff0c;支持最多 4 个字节的字符&#xff0c;能够存储…

前端 js 基础(2)

js For In for in 循环遍历 person 对象每次迭代返回一个键 (x)键用于访问键的值键的值为 person[x] 如果索引顺序很重要&#xff0c;请不要在数组上使用 for in。 索引顺序依赖于实现&#xff0c;可能不会按照您期望的顺序访问数组值。 当顺序很重要时&#xff0c;最好使用 f…

红队打靶练习:MISDIRECTION: 1

信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:69:c7:bf, IPv4: 192.168.12.128 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.12.1 00:50:56:c0:00:08 …

解锁加密生态:用户钱包画像分析

作者&#xff1a;stellafootprint.network 随着加密资产的爆发式增长&#xff0c;对链上交易动态的分析变得至关重要。像 Footprint Analytics 这样的平台让投资者、开发者和企业可以通过用户钱包画像分析&#xff08;Wallet Profile)&#xff0c;去解锁加密生态。 用户钱包画…

Spring-4-代理

前面提到过&#xff0c;在Spring中有两种类型的代理&#xff1a;使用JDK Proxy类创建的JDK代理以及使用CGLIB Enhancer类创建的基于CGLIB的代理。 你可能想知道这两种代理之间有什么区别&#xff0c;以及为什么 Spring需要两种代理类型。 在本节中&#xff0c;将详细研究代理…

ssm基于web的马病管理系统设计与实现+jsp论文

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;马病信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广大…

mxxWechatBot微信机器人V2版本文档说明

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 先看这里 一、前言二、mxxWechatBot流程图三、怎么使用&#xff1f; 一、前言 经过不断地探索与研究&#xff0c;mxxWechatBot正式上线&#xff0c;届时全面开放使用。 mxxWechatBot&am…

递归详解之青蛙跳台阶和汉诺塔问题

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

阻止指定IP地址进行网站访问的简单方式

​  许多网站管理员&#xff0c;应该都会将恶意持续访问的IP请求视为比较头疼的一个问题。要解决这个不正常的访问请求&#xff0c;增强网站安全性&#xff0c;有些简单方式可用。在下面的文章中&#xff0c;介绍了使用.htaccess来禁止某些IP地址的简单方式。 首先&#xff0…

C#的checked关键字判断是否溢出

目录 一、定义 二、示例&#xff1a; 三、生成&#xff1a; 一、定义 使用checked关键字处理溢出。 在进行数学运算时&#xff0c;由于变量类型不同&#xff0c;数值的值域也有所不同。如果变量中的数值超出了变量的值域&#xff0c;则会出现溢出情况&#xff0c;出现溢出…

C++内联函数与引用(超详细)

文章目录 前言一、内联函数1.为什么会存在内联函数2.什么是内联函数3.内联函数注意事项 二、引用1.什么是引用2.引用的特性3.常引用4.引用使用场景5.引用与指针 总结 前言 一、内联函数 1.为什么会存在内联函数 &#x1f9d0;&#x1f9d0;首先我们介绍内联函数之前&#xf…

ESP32入门六(读取引脚的模拟信号[3]:信号出现误差的原因[硬件篇])

在之前的文章中&#xff0c;我们介绍了ESP32在读取模拟信号时出现的误差的软件方面原因&#xff0c;在这一篇中&#xff0c;将会介绍并测试由于硬件或其它方面导致数据出现误差的原因。 一、厂商原因 首先&#xff0c;我们需要知道&#xff0c;在每块EPS32中&#xff0c;在出…

unity随笔- 2D动画制作animation

1.前提&#xff1a;将连续的动作图片制为图集。 2.在Hierarchy中选中含图集的sprites对象。 3.打开animator组件&#xff0c;点击create创建动画组件 4.添加property选择sprite 5.选择图集需要的部分加入animation。&#xff08;animation使用见animator&#xff09;

互联网加竞赛 基于Django与深度学习的股票预测系统

文章目录 0 前言1 课题背景2 实现效果3 Django框架4 数据整理5 模型准备和训练6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于Django与深度学习的股票预测系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff…

【计算机毕业设计】SSM汽车维修预约平台

项目介绍 本项目分为前后台&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色&#xff1a; 管理员登录,新增管理员信息,查看管理员信息,查询管理员信息,查看用户信息列表,查询用户信息,新增新闻公告,查看新闻公告,查询新闻公告,新增配件类…

【unity学习笔记】配置模型,实现眨眼和口型效果

一、vriod捏人 1.在vroidstudio软件中捏人 2.导出模型&#xff08;.vrm) 二、vrid导入unity的插件 1.在Git上搜索、打开univrm。 2.找到release页面找到合适的插件版本。&#xff08;VRM-0.116.0_0f6c&#xff09; 3.将univrm导入到工程中&#xff08;assets&#xff09;。 三…

Unity坦克大战开发全流程——开始场景——开始界面

开始场景——开始界面 step1&#xff1a;设置UI 反正按照这张图拼就行了 step2&#xff1a;写脚本 前面的拼UI都是些比较机械化的工作&#xff0c;直到这里写代码的时候才真正开始有点意思了&#xff0c;从这里开始&#xff0c;我们就要利用面向对象的思路来进行分析&#xff1…

【AIGC-图片生成视频系列-3】AI视频随心而动:MotionCtrl的相机运动控制和物体运动控制

最近&#xff0c;「单张图片生成视频」相关工作很多&#xff0c;但运动控制的准确性依旧是个挑战&#xff0c;包括相机运动的控制以及物体运动控制。 然&#xff0c;MotionCtrl 横空出世。 一. 项目简介 MotionCtrl——一个相机运动控制、物体运动控制的视频工具&#xff0c…