FluentValidation.AspNetCore11.0.0.0
.NET Core 6.0
1.为什么使用FluentValidation?
一个原因是自定义属性验证代码要写很多,模型中的每个需要验证的字段,都需要独立的编写相应的自定义属性。FluentValidation对字段的验证代码需要的相对来说少了点。添加字段校验更简单。
另一个原因:对参数校验进行了解耦,使用AOP分离了验证功能。
2.验证顺序FluentValidation与Attribute
模型绑定-模型验证(Attribute)-FluentValidation
3.可空字段验证,可空字段如果有二阶段验证。例如可空的邮箱格式验证
public class EmailReqValidator : AbstractValidator<EmailReq> { public PlatformUserUpdateReqValidator() { RuleFor(_ => _.Email).EmailAddress().WithMessage("邮箱格式输入有误"); } } public class EmailReq { /// <summary> /// 邮箱 /// </summary> [DisplayName("邮箱")] public string? Email { get; set; } }
(1)null能通过验证
{ "email":null }
(2)""不能通过验证,提示:邮箱输入有误
{ "email":"", }
(3)不传递参数,不能通过验证,提示:邮箱输入有误
{
}
如果想要""和不传递参数时,通过校验,建议调整验证规则
public class EmailReqValidator : AbstractValidator<EmailReq> { public PlatformUserUpdateReqValidator() { RuleFor(_ => _.Email).When(x=>!string.IsNullOrEmpty(x.Email)).EmailAddress().WithMessage("邮箱格式输入有误"); } }
4.FluentValidation CascadeMode全局设置
CascadeMode可以设置如果验证失败单个字段仅验证一次,单个类仅验证一次。
(1)设置模型类的CascadeMode,当模型的第一个验证失败,后续验证不执行。
ValidatorOptions.Global.DefaultClassLevelCascadeMode = CascadeMode.Stop;
(1)设置模型字段的CascadeMode,当字段的第一个验证失败,后续验证不执行。
ValidatorOptions.Global.DefaultRuleLevelCascadeMode = CascadeMode.Stop;
这两个设置放到启动文件里面就可以,比如Program.cs文件,跟着FluentValidation注入代码即可。
services.AddFluentValidationAutoValidation();//Fluent参数验证
ValidatorOptions.Global.DefaultClassLevelCascadeMode = CascadeMode.Stop;
ValidatorOptions.Global.DefaultRuleLevelCascadeMode = CascadeMode.Stop;
5.IsEnum 枚举验证,默认值也校验失败(待优化)
public class BannerUpdateReqValidator : AbstractValidator<BannerUpdateReq> { public BannerUpdateReqValidator() { RuleFor(_ => _.Type).IsInEnum() .WithMessage("枚举输入有误") .Must((x, y) => { return x.Type != BannerEnum.DEFAULT; }) .WithMessage("枚举输入有误"); } } public enum BannerEnum { /// <summary> /// 默认 /// </summary> [Description("默认")] DEFAULT = -1, /// <summary> /// 后台Banner /// </summary> [Description("后台Banner")] BANNER = 0, } public class BannerUpdateReq { public BannerEnum Type { get; set; } }