asp.net core的輸入模型驗證

樓主去做志願者啦,最近才上班,荒廢了將近一個月的時間,手和腦袋都退化了,今天跟大家一起學習下模型驗證吧。

我們把數據存到數據庫之前需要對數據進行驗證,來判斷它的格式、大小等,是否在我們允許的範圍內。這其實時一個不小的工作量,爲了減少我們的工作量,.net core提供了三種模型驗證的方法。掌握它你就可以對數據進行360度無死角的驗證,絕不漏掉任何死角。

其實我們對數據的驗證時在我們模型綁定之後就立即開始的,在執行我們控制器Action中任何一行代碼之前進行的。在我們開發Api的時候,這種驗證更是全自動的,自動驗證,自動回覆驗證錯誤。下面我們一起看一下這三種模型驗證的方法,我用一個簡單的例子來分別演示這三種操作。

一、驗證標籤

首先我們先準備一個例子,假設我們現在有個記錄物品信息的系統,且提供一個Api可以將我們傳過去的相關字段,存在數據庫中,這個Action接受一個Product類型參數,參數通過模型綁定自動填充,完了進行數據的驗證:

 Product類的定義如下:

 可以看到上面的截圖中標紅的部分,對數據進行了一些約束,除了我上面列出的標籤,還有其他標籤,用於驗證,他們在System.ComponentModel.DataAnnotations;名字空間下。當我們調用到這個Action時,這些驗證規則就會觸發,如果驗證失敗,將返回相應的信息,標籤中一個ErrorMessage參數,用它對提示信息進行格式化,否則將提示默認的英文。佔位符{0}表示[Display(Name = "xx")]的值,後面的依次是標籤中傳入的參數。

 

下面我們用PostMan 來測試一下上面的例子,輸入一些不能通過驗證的信息,提示的信息如下:

很好奇我們爲啥沒做任何操作,自動短路了我們的操作,返回了驗證的錯誤信息。這一切都歸功於 [ApiController]這個標籤,它作用於Controller,可以幫助我們自動實現模型綁定和驗證。如果不要這個標籤那麼我們需要手動執行驗證,操作如下:

這樣我們的錯誤信息也能返回了。 

二、通過繼承IValidatableObject接口

我們用Product類繼承IValidatableObject,並實現Validate方法來驗證輸入的模型

現在假設我們有個需求,要求我們輸入的備註(Remark字段)中必須要包含產品的名稱(ProductName字段)的值,我們就可以這麼去定義驗證:

測試我們的驗證規則是否生效:

可以看到,我們定義的規則已經生效,但是這邊注意一點,我們通過接口定義的這個驗證規則總是在標籤驗證後面執行的,也就是說如果標籤驗證沒有通過,則這個驗證將不去執行了,節省了開銷。我們修改上面的請求,看一下結果:

可以看到,我只修改了郵箱,使得它不滿足郵箱驗證,並且備註中也並不包含產品名稱,結果顯示的錯誤只有這一條,後面的驗證被短路,未執行。

三、自定義驗證標籤

如果不想用上面提到的兩種驗證規則,或者上面的操作不能幫你實現你奇妙的驗證規則,那麼我們可以通過這個方法來自定義一個標籤,來實現驗證。首先我們要新建一個類,實現ValidationAttribute類,在Override一下IsValid方法。細心的同學們可能已經發現了,我們的在方法一中用到的標籤,也是通過這種方式來寫的,下面我們就來實操一下吧。

現在來了一個需求,產品的單價低於100的不收,大於9999的不收,產品數量少於100個不收,大於500個也不收,代碼如下:

現在只要我們把這個標籤應用到我們的類上面就可以進行驗證了,這邊注意一點,我們自定義的標籤可以作用在類上也可以作用在屬性上面,但是需要我們根據實際情況,不要隨便添。結果如下:

 以上就是.net core 提供給我們的三種進行模型驗證的方式,除了以上的三種,其實還有另外一種方式FluentValidation,FluentValidation是一個非常流行的構建強類型驗證規則的.NET庫,由於篇幅有限,感興趣的同學,可以自行學習和了解。

以上是我個人的理解整理而成,難免有疏漏和錯誤的地方,請諒解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章