為了保持内容的完整性,大部分内容我都是參考fluentvalidation提供的幫助文檔,自己經過翻譯和了解加工。更好的呈現給大家。
nuget packages:install-package fluentvalidation
asp.net mvc內建包:install-package fluentvalidation.mvc5
下面我們将從一個簡單的驗證器的建立以及使用來介紹它的基本功能。
使用之前,要引用fluentvalidation.dll,太簡單,就省略了吧。為了給特定的對象定義一組驗證規則,必須建立一個繼承abstractvalidator<t>的類,t是需要驗證的類型。例如,假設我們有一個customer類,如下所示:
是以按照上面要求,我們要給customer定義一組驗證規則,就要繼承abstractvalidator<customer>,如下面代碼:
驗證規則本身在驗證器的構造函數中定義。為了給特定屬性指定一個驗證規則,需要調用rulefor方法,通過屬性的lambda表達式來進行你想要的驗證。例如,確定surname屬性不是null,驗證器應該這樣寫:
針對同一個屬性編寫驗證代碼時,我們可以使用鍊式的方式進行,非常友善,也容易了解。如下面的代碼:
上面的注釋已經很明顯了,針對surname屬性,直接進行判斷和編寫代碼,同樣可以寫其他的,一直寫下去。。。為了執行驗證器,我們首先要建立一個驗證器的執行個體對象,然後将要驗證的對象傳遞給validate方法,即可進行驗證。如下面代碼:
至于結果的内容,請接着往下看。
在使用驗證器的validate進行驗證後,擷取的validationresult對象裡面提供了2個主要資訊:
1.isvalid: 标記是否驗證成功
2.errors :錯誤情況,驗證失敗的對象集合,包括所有驗證失敗對象的細節。
例如下面的代碼将驗證失敗的資訊列印出來:
上一節中,我們看到了驗證結果的處理情況,但是在很多情況下,如果驗證失敗的情況下,要及時抛出異常給使用者,是以在驗證的時候就要注意抛出異常,fluentvalidation也提供了這樣的機制,它為驗證器提供了一個validateandthrow 的擴充方法。使用這個方法後,如果碰到失敗的情況,會及時抛出一個validationexception 異常,讓業務驗證過程使用。主要代碼如下:
我們前面處理的都是單個驗證器的使用,構成也基本清楚了,但如果在目前驗證的實體類中還有其他對象,也需要對這個對象進行各種屬性驗證,該怎麼辦。舉個例子,假設我們有一個 客戶類 customer 以及位址類address,在customer 中包括了一個address類型的屬性,用來存儲目前客戶的位址資訊,如下面所示代碼:
由于我們也需要對address類進行,驗證,是以先類似的構造一個address驗證器:
然後我們同理要構造customervalidator驗證器,在驗證address的時候,及可以複用上面的addressvalidator,如下面代碼:
過程比較簡單,更加複雜的處理也類似,應該沒啥問題了。值得注意的是,如果address 是集合類型,如list<address> ,則要使用setcollectionvalidator來進行驗證,和setvalidator的使用類似。
假設一個person類有3個屬性(id,surname,forename),我們寫一個驗證器分别對幾個屬性進行驗證,并将其中2個的驗證規則放在一個規則集合裡面ruleset,名稱為:names,如下面代碼:
然後我們在驗證的時候,就可以靈活指定規則集的名稱了,一次可以指定單個或者多個,值得注意的是,沒有放在集合中的規則,預設在 default 組中。如下面的代碼:
上面就是今天的内容,我們對驗證器的完整過程和使用細節進行了很深入的研究,相信自己構造一個強大的驗證器已經很容易了吧。接下來的内容,我們将繼續介紹内置的一些驗證方法和規則。對于該元件的源碼可以直接從github擷取,本文将在後面的文章中釋出自己制作的chm幫助文檔。敬請關注!