官网: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. 多主架构:VLDB技术论文《Taurus MM: bringing multi-master to the cloud》解读

    本文分享自华为云社区<多主创新,让云数据库性能更卓越>,作者: GaussDB 数据库. 华为<Taurus MM: bringing multi-master to the clo ...

  2. Jenkins持续集成入门到精通(进阶篇)

    视频参考:https://www.bilibili.com/video/BV1Vp4y1b7ZN?p=51 1. Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: ...

  3. 异常:no transaction is in progress

    转载请注明出处: 在使用  @Scheduled 注解创建了一个定时任务,并通过定时任务不断向mysql写入数据,写入数据的方式是通过 jpa 的方式,在代码运行的过程中出现错误:no transac ...

  4. Nuxt.js 生成sitemap站点地图文件

    Nuxt.js 生成sitemap站点地图文件 背景介绍 ​ 使用nuxt框架生成静态文件支持SEO优化,打包之后需要生成一个 sitemap.xml 文件方便提交搜索引擎进行收录.官网有提供一个插件 ...

  5. LGPL协议原文及中文翻译

    LGPL协议原文及中文翻译 参考链接 原文: GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 ...

  6. 它让你1小时精通RabbitMQ消息队列、且能扛高并发

    支持.Net Core(2.0及以上)与.Net Framework(4.5及以上) 本文所述方案近期被江苏省某亿级数据量+高并发的政府"物联网"项目采用,获得圆满成功!! [目录 ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (118)-- 算法导论10.3 3题

    三.用go语言,在ALLOCATE-OBJECT和 FREE-OBJECT过程的实现中,为什么不需要设置或重置对象的 prev 属性呢? 文心一言: 在 Go 语言中,ALLOCATE-OBJECT ...

  8. c# 使用打印机打印并设置打印位置及宽高

    1.在界面中使用自带的控件printDocument 2.将以下函数绑定到控件的PrintPage事件 private void printDocument1_PrintPage(object sen ...

  9. PKUSC & GDCPC 2023 游记

    离得太近,游记打算扔一起. 有没有神仙面基啊 /kel. PKUSC 2023 Day -? 突然听说不给 NOI Linux,震惊. 前情提要:在从 CSP 开始就全员强制 linux 的 LN 为 ...

  10. P7072 [CSP-J2020] 直播获奖

    Problem 考查知识点:桶优化. 题目简述 竞赛的获奖率为 \(w\%\),即当前排名前 \(w\%\) 的选手的最低成绩就是即时的分数线. 若当前已评出了 \(p\) 个选手的成绩,则当前计划获 ...