在.NET Core 中使用 FluentValidation 进行规则验证的方案
发布时间:2023-03-02 13:10:19 所属栏目:Asp教程 来源:
导读:不用说,规则验证很重要,无效的参数,可能会导致程序的异常。
如果使用Web API或MVC页面,那么可能习惯了自带的规则验证,我们的控制器很干净:
public class User
{
[Required]
public string Fi
如果使用Web API或MVC页面,那么可能习惯了自带的规则验证,我们的控制器很干净:
public class User
{
[Required]
public string Fi
|
不用说,规则验证很重要,无效的参数,可能会导致程序的异常。 如果使用Web API或MVC页面,那么可能习惯了自带的规则验证,我们的控制器很干净: public class User { [Required] public string FirstName { get; set; } [Required] public string LastName { get; set; } } 这种很常见,但是今天我想给你一个更好的替代方案:FluentValidation, 通过这个库,您可以流畅地定义用于对象验证的复杂规则,从而轻松构建和理解验证规则,您可以在 Github 上找到这个项目。 安装 FluentValidation 我新建了一个很简单的.NET Core 的Web API 程序,只有一个接口是用户注册,入参是一个User类, 然后在Nuget中安装 FluentValidation。 创建第一个验证 对于要验证的每个类,必须创建其自己的验证器,每个验证器类都必须继承AbstractValidator<T>,其中T是要验证的类,并且所有验证规则都在构造函数中定义。 public class UserValidator : AbstractValidator<User> { public UserValidator() { RuleFor(x => x.FirstName).NotEmpty(); RuleFor(x => x.LastName).NotEmpty(); } } 就这些了,您已经创建了第一个验证器,是不是超级简单! 还有一些其他的规则,比如 MinimumLength,MaximumLength和Length,用于验证长度。 { public UserValidator() { RuleFor(x => x.FirstName).NotEmpty(); RuleFor(x => x.FirstName).MinimumLength(3); RuleFor(x => x.FirstName).MaximumLength(20); RuleFor(x => x.LastName).NotEmpty(); } } 验证入参 我们之前已经定义了验证规则,现在开始使用它,您只需要new 一个UserValidator对象,然后调用Validate方法, 它会返回一个对象,其中包含了验证状态和所有没有通过验证的信息。 [HttpPost] public IActionResult Register(User newUser) { var validator = new UserValidator(); var validationResult = validator.Validate(newUser); if (!validationResult.IsValid) { return BadRequest(validationResult.Errors.First().ErrorMessage); } return Ok(); } { "FirstName": "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张", "LastName": "张" } 我会收到验证错误:"The length of 'First Name' must be 20 characters or fewer. You entered 24 characters"。 好吧,我不喜欢这个消息,那么你可以自定义错误消息,这很简单,您可以使用 WithMessage 方法。 - RuleFor(x => x.FirstName).MaximumLength(20); + RuleFor(x => x.FirstName).MaximumLength(20).WithMessage("您的名字长度已经超出了限制!"); 流利验证 - RuleFor(x => x.FirstName).NotEmpty(); - RuleFor(x => x.FirstName).MinimumLength(3); + RuleFor(x => x.FirstName).NotEmpty().MinimumLength(3); public UserValidator() { RuleFor(x => x.FirstName) .MaximumLength(20).WithMessage("您的名字长度已经超出了限制!") .NotEmpty().MinimumLength(3); RuleFor(x => x.LastName).NotEmpty(); } 常见的验证规则 这个库有很多现成的基本类型验证规则, 对于字符串,您可以使用不同的方法,比如 EmailAddress,IsEnumName(检查值是否在指定的Enum类型中定义)和 InclusiveBetween, 检查该值是否在定义的范围内。 现在,我在User类添加了另外两个字段,Password 和 ConfirmPassword。 Password字段是一个字符串,有效的长度必须在5到15个字符之间,并且要符合正则,为了定义是否满足安全规则,我定义了一个HasValidPassword方法,它会返回一个bool值。 private bool HasValidPassword(string pw) { var lowercase = new Regex("[a-z]+"); var uppercase = new Regex("[A-Z]+"); var digit = new Regex("(\\d)+"); var symbol = new Regex("(\\W)+"); return (lowercase.IsMatch(pw) && uppercase.IsMatch(pw) && digit.IsMatch(pw) && symbol.IsMatch(pw)); } RuleFor(x => x.FirstName) .MaximumLength(20).WithMessage("您的名字长度已经超出了限制!") .NotEmpty().MinimumLength(3); RuleFor(x => x.LastName).NotEmpty(); RuleFor(x => x.Password) .Length(5, 15) .Must(x => HasValidPassword(x)); RuleFor(x => x.Password) .Length(5, 15) - .Must(x => HasValidPassword(x)); + .Must(HasValidPassword); } RuleFor(x => x.ConfirmPassword) .Equal(x => x.Password) .WithMessage("2次密码不一致!"); 注入验证器 public void ConfigureServices(IServiceCollection services) { services.AddControllers().AddFluentValidation(); services.AddTransient<IValidator<User>, UserValidator>(); } 注意:这个地方的生命周期是 Transient。 [HttpPost] public IActionResult Register(User newUser) { return Ok(); { "FirstName": "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张", "LastName": "张" { "title": "One or more validation errors occurred.", "status": 400, "traceId": "|c4523c02-4899b7f3df86a629.", "errors": { "FirstName": [ "您的名字长度已经超出了限制!" ] } } (编辑:驾考网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
