天天看點

在ASP.NET MVC中如何應用多個相同類型的ValidationAttribute?一、一個自定義ValidationAttribute:RangeIfAttribute二、将RangeIfAttribute應用于Employee三、重寫TypeId屬性解決問題

ASP.NET

為了示範在相同的目标元素(類、屬性或者字段)應用多個同類的ValidationAttribute,我定義了一個名稱為RangeIfAttribute特性用于進行“有條件的區間驗證”。如下面的代碼片斷所示,RangeIfAttribute是RangeAttribute的子類,應用在上面的AttributeUsageAttribute特性的AllowMultiple

屬性被設定為True。RangeIfAttribute定義了Property和Value兩個屬性,分别表示被驗證屬性/字段所在類型的另一個屬性名稱和相應的值,隻有當指定的屬性值與通過Value屬性值相等的情況下我們在真正進行驗證。具體的驗證邏輯定義在重寫的IsValid方法中。

我們将RangeIfAttribute特性應在具有如下定義的表示員工的Employee類型的Salary(表示薪水)屬性上,另外一個屬性Grade表示員工的級别。應用在Salary屬性上的RangeIfAttribute特性展現了基于級别的薪水區間驗證規則:對于G7、G8和G9的員工,其薪水分别在2000~3000,3000~4000和4000~5000範圍内。

現在我們建立如下一個EmployeeController,其預設的兩個Index操作方法定義如下。在HttpPost的Index操作中,如果驗證成功我們将“驗證成功”字樣作為ModelError添加到ModelState中。

下面是Index操作預設的View的定義:

遺憾的是,ASP.NET MVC并不能按照我們希望的方對我們的輸入進行驗證。如下面的截圖所示,我們隻有在輸入G9的時候,系統才能實施成功地驗證,對于G7和G8則被輸入的Salary值(0.00)是合法的。

<a href="http://images.cnblogs.com/cnblogs_com/artech/201201/201201131048273260.png"></a>

之是以會發生上述的這種現象,原因在于被應用到Salary屬性上的RangeIfAttribute特性,最終隻有最後一個(Value=“G9”)被使用到。ASP.NET

MVC在生成包括驗證特性的Model的中繼資料的時候,針對某個元素的所有ValidationAttribute是被維護在一個字典上的,而這個字典的值就是Attribute的TypeId屬性。在預設的情況下,Attribute的TypeId傳回的是自身的類型,是以導緻應用到相同目标元素的同類ValidationAttribute隻能有一個。幸好Attribute的TypeId屬性是可以被重寫的,縣在我們在RangeIfAttribute中按照如下的方式對這個屬性進行重寫:

再次運作我們的程式則一切正常:

<a href="http://images.cnblogs.com/cnblogs_com/artech/201201/201201131048294109.png"></a>

值得一提的是:重寫TypeId屬性的方式隻能解決服務端驗證的問題,對于用戶端認證無效。

作者:蔣金楠

微信公衆賬号:大内老A

如果你想及時得到個人撰寫文章以及著作的消息推送,或者想看看個人推薦的技術資料,可以掃描左邊二維碼(或者長按識别二維碼)關注個人公衆号(原來公衆帳号蔣金楠的自媒體将會停用)。

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

<a href="http://www.cnblogs.com/artech/archive/2012/01/13/multiple-validation-attribute.html" target="_blank">原文連結</a>

繼續閱讀