今天就跟大家聊聊有关怎么在.net core 中利用FluentValidation 进行规则验证,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。安装 FluentValidation
今天就跟大家聊聊有关怎么在.net core 中利用FluentValidation 进行规则验证,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
安装 FluentValidation
新建了一个很简单的.Net Core 的WEB api 程序,只有一个接口是用户注册,入参是一个User类, 然后在Nuget中安装 FluentValidation
。
创建第一个验证
对于要验证的每个类,必须创建其自己的验证器,每个验证器类都必须继承AbstractValidator<T>
,其中T是要验证的类,并且所有验证规则都在构造函数中定义。
最简单的验证是针对空值,如果要指定FirstName和LastName都不能为空,这个验证器是这样:
public class UserValidator : AbstractValidator<User>{public UserValidator(){RuleFor(x => x.FirstName).NotEmpty();RuleFor(x => x.LastName).NotEmpty();}}
就这些了,您已经创建了第一个验证器,是不是超级简单!
还有一些其他的规则,比如 MinimumLength,MaximumLength和Length,用于验证长度,您可以把多个规则指定到一个字段,就像这样:
public class UserValidator : AbstractValidator<User>{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);}
ConfirmPassword字段的唯一要求是等于Password字段:
RuleFor(x => x.ConfirmPassword).Equal(x => x.Password).WithMessage("2次密码不一致!");
修改Startup类中的ConfigureServices方法:
public void ConfigureServices(IServiceCollection services){services.AddControllers().AddFluentValidation();services.AddTransient<IValidator<User>, UserValidator>();}
注意:这个地方的生命周期是 Transient。
这样,在调用注册接口的时候,会自动进行规则验证:
[HttpPost]public IActionResult Register(User newUser){return Ok();}
然后,我们再尝试传入参数来调用接口:
{ "FirstName": "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张", "LastName": "张"}
很明显,验证不通过,接口会返回这样的错误信息:
{ "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "|c4523c02-4899b7f3Df86a629.", "errors": { "FirstName": [ "您的名字长度已经超出了限制!" ] }}
看完上述内容,你们对怎么在.net Core 中利用FluentValidation 进行规则验证有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网精选频道,感谢大家的支持。
--结束END--
本文标题: 怎么在.NET Core 中利用FluentValidation 进行规则验证
本文链接: https://lsjlt.com/news/246505.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0