文章目录
-
- 入门程序
-
- 安装
- 案例:登录
- 验证器
-
- 内置验证器
- 自定义验证器
-
- 编写自定义验证器
- 可重复使用的属性验证器
- 本地化
- 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
{
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 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(这是 FluentValidation 的所有内置规则的定义方式)。
using FluentValidation.Validators;
using FluentValidation;
namespace FluentValidationTest
{
///
/// 条件验证器
///
///
///
public class ConditionValidator : PropertyValidator
{
Func _func;
string _message;
///
///
///
/// 委托
/// 提示消息
public ConditionValidator(Func func, string message)
{
_func = func;
_message = message;
}
public override string Name => "ConditionValidator";
public override bool IsValid(ValidationContext context, TProperty value)
{
return _func.Invoke(context.InstanceToValidate, value);
}
protected override string GetDefaultMessageTemplate(string errorCode)
=> _message;
}
///
/// 扩展类
///
public static class ValidatorExtensions
{
public static IRuleBuilderOptions Condition(this IRuleBuilder ruleBuilder, Func func, string message)
{
return ruleBuilder.SetValidator(new ConditionValidator(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();
//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();
});
自定义返回结果
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.fwqtg.net
在 PHP 中,GET 和 POST 是用于从客服务器托管网户端向服务器传递数据的两种常用的 HTTP 请求方法。它们之间的主要区别在于数据传递的方式和使用场景。 GET 方法: 数据传递方式: 使用 URL 参数传递数据,数据附加在 URL 后面,以 ? 开…