POST或者GET到服務端的數據是必須進行有效性校驗的!數據校驗也是重要的業務邏輯,讓數據可信!
.NET中內置了驗證組件(System.ComponentModel.DataAnnotations),可以簡單的以特性方式實現,也是最常用的。
FluentValidation是個開源項目,Github(https://github.com/FluentValidation/FluentValidation),它讓我們多了一種可選性,至於用哪種方式就看個人或團隊習慣。
.netcore3.1中使用FluentValidation可以簡單按以下步驟實現:
1、Nuget引用程序包:
2、Startup文件ConfigureServices方法的設置:
1 services.AddControllersWithViews() 2 .AddFluentValidation(config =>//添加FluentValidation驗證 3 { 4 //程序集方式添加驗證 5 config.RegisterValidatorsFromAssemblyContaining(typeof(Validation.LoginModelValidation)); 6 //是否與MvcValidation共存,設置為false后將不再執行特性方式的驗證 7 config.RunDefaultMvcValidationAfterFluentValidationExecutes = false; 8 });
3、創建驗證規則(格式比較固定其中LoginModel為被校驗模型):
1 public class LoginModelValidation : AbstractValidator<LoginModel> 2 { 3 public LoginModelValidation() 4 { 5 this.CascadeMode = CascadeMode.StopOnFirstFailure; 6 this.RuleFor(o => o.UserName) 7 .NotEmpty().WithMessage("用戶名不能為空") 8 .Length(4, 32).WithMessage("用戶名長度校驗失敗"); 9 10 this.RuleFor(o => o.Password) 11 .NotEmpty().WithMessage("用戶密碼不能為空") 12 .Length(4, 8).WithMessage("用戶密碼長度校驗失敗"); 13 14 //子對象校驗 15 //RuleFor(o => o.Detail) 16 // .NotNull().WithMessage("明細對象不能為空") 17 // .SetValidator(t => new LoginModelDetailValidation()); 18 } 19 }
官方提供了很多驗證規則,我們可以直接github下載源碼查看,另外還可以自定義規則。
4、使用方法:
在mvc中可以直接使用內置模型校驗,FluentValidation會處理好ModelState,兼容原有程序寫法,如
1 if (!ModelState.IsValid) 2 { 3 return View("Index", model); 4 }
還可以使用FluentValidation提供的校驗方式,也是比較通用的方式:
1 //代碼校驗方式 2 Validation.LoginModelValidation validationRules = new Validation.LoginModelValidation(); 3 var validResult = validationRules.Validate(model); 4 if (!validResult.IsValid) 5 { 6 validResult.AddToModelState(ModelState, string.Empty); 7 return View("Index", model); 8 }
總結
FluentValidation以集中管理化方式來處理規則,語法簡單易懂,邏輯清晰,可擴展性好,讓程序的后期運維也比較方便,而且github一直在維護,是個不錯的可選組件。