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

2023-12-31 00:12

本文主要是介绍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]));}}
}

这篇关于Asp .Net Core 集成 FluentValidation 强类型验证规则库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/554424

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

2、PF-Net点云补全

2、PF-Net 点云补全 PF-Net论文链接:PF-Net PF-Net (Point Fractal Network for 3D Point Cloud Completion)是一种专门为三维点云补全设计的深度学习模型。点云补全实际上和图片补全是一个逻辑,都是采用GAN模型的思想来进行补全,在图片补全中,将部分像素点删除并且标记,然后卷积特征提取预测、判别器判别,来训练模型,生成的像

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &