使用 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
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();
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])); } } }