官网: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();
}
}
}

测试

验证器

内置验证器

网站: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 强类型验证规则库的更多相关文章

  1. [Abp 源码分析]十七、ASP.NET Core 集成

    0. 简介 整个 Abp 框架最为核心的除了 Abp 库之外,其次就是 Abp.AspNetCore 库了.虽然 Abp 本身是可以用于控制台程序的,不过那样的话 Abp 就基本没什么用,还是需要集合 ...

  2. asp.net core 集成JWT(一)

    [什么是JWT] JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案. JWT的官网地址:https://jwt.io/ 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT ...

  3. asp.net core 集成JWT(二)token的强制失效,基于策略模式细化api权限

    [前言] 上一篇我们介绍了什么是JWT,以及如何在asp.net core api项目中集成JWT权限认证.传送门:https://www.cnblogs.com/7tiny/p/11012035.h ...

  4. ABP官方文档翻译 6.2.1 ASP.NET Core集成

    ASP.NET Core 介绍 迁移到ASP.NET Core? 启动模板 配置 启动类 模块配置 控制器 应用服务作为控制器 过滤器 授权过滤器 审计Action过滤器 校验过滤器 工作单元Acti ...

  5. asp.net core 集成 log4net 日志框架

    asp.net core 集成 log4net 日志框架 Intro 在 asp.net core 中有些日志我们可能想输出到数据库或文件或elasticsearch等,如果不自己去实现一个 Logg ...

  6. Asp.Net Core 集成 Hangfire 配置使用 Redis 存储

    Hangfire 官方支持 MSSQL 与 Redis(Hangfire.Pro.Redis) 两种 ,由于我的数据库是 MYSQL ,粗略查询了一下文档,现在对 .NET Core 支持的并不够好, ...

  7. asp.net core集成MongoDB

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 一.前言及MongoDB的介绍 最近在整合自己的框架,顺便把MongoDBD的最简单CRUD重构一下作为组件化集成到asp.net ...

  8. asp.net core集成CAP(分布式事务总线)

    一.前言 感谢杨晓东大佬为社区贡献的CAP开源项目,传送门在此:.NET Core 事件总线,分布式事务解决方案:CAP 以及 如何在你的项目中集成 CAP[手把手视频教程],之前也在工作中遇到分布式 ...

  9. asp.net core 3.x 身份验证-3cookie身份验证原理

    概述 上两篇(asp.net core 3.x 身份验证-1涉及到的概念.asp.net core 3.x 身份验证-2启动阶段的配置)介绍了身份验证相关概念以及启动阶段的配置,本篇以cookie身份 ...

  10. asp.net core 集成 Prometheus

    asp.net core 集成 prometheus Intro Prometheus 是一个开源的现代化,云原生的系统监控框架,并且可以轻松的集成 PushGateway, AlertManager ...

随机推荐

  1. Solution Set -「CF 1486」

    「CF 1486A」Shifting Stacks Link. 考虑最少需要操作多少次后判断. #include<map> #include<cstdio> using nam ...

  2. ConcurrentHashMap底层源码分析

    ConcurrentHashMap源码底层分析 1.ConcurrentHashMap初始化 jdk8之后,ConcurrentHashMap采用了HashMap的底层结构(数据,链表,红黑树),在此 ...

  3. Opencv中goodFeaturesToTrack函数(Harris角点、Shi-Tomasi角点检测)算子速度的进一步优化(1920*1080测试图11ms处理完成)。

    搜索到某个效果很好的视频去燥的算法,感觉效果比较牛逼,就是速度比较慢,如果能做到实时,那还是很有实用价值的.于是盲目的选择了这个课题,遇到的第一个函数就是角点检测,大概六七年用过C#实现过Harris ...

  4. 用结构化思维解一切BUG(2):实践原则

    背景 本文是系列文章<用结构化思维解一切BUG>的第二篇.本系列文章主要介绍一种「无需掌握技术细节,只需结构化思维和常识即可解一切BUG的方法」. 在前序文章<用结构化思维解一切BU ...

  5. 谈谈SSO单点登录的设计实现

    谈谈SSO单点登录的设计实现 本篇将会讲讲单点登录的具体实现. 实现思路 其实单点登录在我们生活中很常见,比如学校的网站,有很多个系统,迎新系统,教务系统,网课系统.我们往往只需要登录一次就能在各个系 ...

  6. (Good topic)字符串的最大公因子 (3.21leetcode每日打卡)

      对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 s ...

  7. 递归+记忆化递归+DP:斐波那契数列

    递归:算法复杂度O(2^N) 1 int fib(int n) 2 { 3 if (n == 0) 4 { 5 return 0; 6 } 7 if (n == 1) 8 { 9 return 1; ...

  8. 学习JavaScript的第一天

    JavaScript概述 JavaScript的介绍 js属于一门面向对象的编程语言 属于跨平台 面向对象(oop) 以对象方式实现所有的功能 跨平台:js代码不论是在什么样的操作系统上执行结果都是一 ...

  9. .NET开源且好用的权限工作流管理系统

    前言 系统权限管理.工作流是企业应用开发中很常见的功能,虽说开发起来难度不大,但是假如从零开始开发一个完整的权限管理和工作流平台的话也是比较耗费时间的.今天推荐一款.NET开源且好用的权限工作流管理系 ...

  10. springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作

    第一步:在mongodb的官网里面创建云服务器 点进去 这是免费的,由于是一个项目只可以创建一个,这里我已经创建好了 用本地的mongodb服务也是可以的 第二步:点击connect,下载连接mong ...