POST或者GET到服務端的資料是必須進行有效性校驗的!資料校驗也是重要的業務邏輯,讓資料可信!
.NET中内置了驗證元件(System.ComponentModel.DataAnnotations),可以簡單的以特性方式實作,也是最常用的。
FluentValidation是個開源項目,Github(https://github.com/FluentValidation/FluentValidation),它讓我們多了一種可選性,至于用哪種方式就看個人或團隊習慣。
.netcore3.1中使用FluentValidation可以簡單按以下步驟實作:
1、Nuget引用程式包:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CN3YDM3gTN1QTL1czN0QzNyIDM3EDNwAjMwITLzYTO0QzLcRDMwIDMy8CXzYTO0QzLcd2bsJ2Lc12bj5ycn9Gbi52YuAjMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
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一直在維護,是個不錯的可選元件。
作者:屈魯奇
出處:https://www.cnblogs.com/quluqi
聯系:[email protected] QQ:496195435
本文版權歸作者和部落格園共有,歡迎轉載,但必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接。如有問題或建議,請多多賜教,非常感謝。