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; } }