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

文章目录

    • 入门程序
      • 安装
      • 案例:登录
    • 验证器
      • 内置验证器
      • 自定义验证器
        • 编写自定义验证器
        • 可重复使用的属性验证器
    • 本地化
    • 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.hqwc.cn/news/309936.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT编译并部署QtMqtt相关环境+跑测demo【超详细教程】

文章目录 概要整体架构流程▷下载指定版本的QMqtt源码&#xff1a;▷编译后同步MQTT相关文件&#xff1a; 技术名词解释技术实现步骤详解一、编译源码1、编译报错2、解决思路3、编译通过 二、继续完善mqtt应用环境1、打开编译生成的shadow build文件夹2、同步lib3、同步bin4、同…

【unity中使用高度图创建地图】

unity中使用高度图创建地图 插件 讲解案例为unity2022版本 这个是插件地址 也可以在资源商店中搜索 terrain-tools 介绍 Terrain Tools入门Terrain Tools是一个软件包&#xff0c;你可以选择将其添加到Unity 2019.1或更高版本中的任何项目中。要将该软件包添加到你的项目…

51单片机项目(22)——基于51单片机的计算器protues仿真

1.功能设计 使用4*4矩阵键盘&#xff0c;实现了加减乘除等运算&#xff0c;运算过程及其结果显示在LCD1602屏幕上面。&#xff08;工程保证完整可用&#xff01;&#xff01;&#xff09; 加法演示&#xff1a; 减法演示&#xff1a; 乘法&#xff1a; 除法&#xff1a; 2.模块…

黑马程序员SSM框架-Maven进阶

分模块开发与设计 分模块开发意义 分模块开发 依赖管理 依赖传递 依赖传递冲突问题 可以点击红框按钮查看依赖情况。 可选依赖和排除依赖 继承和聚合 聚合 聚合工程开发 继承 聚合和继承的区别 属性 属性的配置与使用 资源文件引用属性 其他属性&#xff08;了解&#xff0…

线上发布稳定性方案介绍

目录 一、方案说明 二、线上发布问题描述 2.1 无损上下线背景说明 2.1.1 服务⽆法及时下线 2.1.2 初始化慢 2.1.3 注册太早 2.1.4 发布态与运⾏态未对⻬ 三、问题解决方案 3.1 无损下线方案 3.1.1 什么是无损下线 3.1.2 传统解决方式 3.1.3 云原生场景解决方案 3.1…

SpringMVC:SSM(Spring+SpringMVC+MyBatis)代码整理

文章目录 SpringMVC - 07SSM 框架代码整理一、准备工作1. 分析需求、准备数据库2. 新建一个项目&#xff0c;导入依赖&#xff1a;pom.xml3. 用 IDEA 连接数据库 二、MyBatis 层1. 外部配置文件&#xff1a;db.properties2. MyBatis 核心配置文件&#xff1a;mybatis-config.xm…

读书笔记1——用户画像平台构建与业务实践

目录 1.画像的基本概念 2、OLAP的3种建模类型 3.OLAP相关技术发展历程 4.业界画像平台介绍 神策数据 2.火山引擎增长分析 3. GrowingLo 4.阿里云智能用户增长 5.涉及岗位 这是一本从功能模块、技术实现、平台构建、业务应用4个层次由浅入深地讲解用户画像的著作。作者在…

一套好的商业模式,助力生意长虹!

在当今竞争激烈的市场环境中&#xff0c;一套好的商业模式对于企业的成功至关重要。一个优秀的商业模式不仅能够提高企业的盈利能力&#xff0c;还能让企业在市场中脱颖而出&#xff0c;实现长期的稳定发展。本文将为您揭示一套神奇的商业模式&#xff0c;帮助您的生意长虹&…

【分布式配置中心】聊聊Apollo的安装与具体配置变更的原理

【管理设计篇】聊聊分布式配置中心 之前就写过一篇文章&#xff0c;介绍配置中心&#xff0c;但是也只是简单描述了下配置中心的设计点。本篇从apollo的安装到部署架构到核心原理进一步解读&#xff0c;大概看了下apollo的原理&#xff0c;感觉没有必要深究&#xff0c;所以就…

4.15 构建onnx结构模型-Max

前言 构建onnx方式通常有两种&#xff1a; 1、通过代码转换成onnx结构&#xff0c;比如pytorch —> onnx 2、通过onnx 自定义结点&#xff0c;图&#xff0c;生成onnx结构 本文主要是简单学习和使用两种不同onnx结构&#xff0c; 下面以 Max 结点进行分析 方式 方法一&am…

前端 js 基础(1)

js 结果输出 &#xff08;点击按钮修改文字 &#xff09; <!DOCTYPE html> <html> <head></head><body><h2>Head 中的 JavaScript</h2><p id"demo">一个段落。</p><button type"button" onclic…

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

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