MVC中的客戶端及服務端模型驗證信息都以ModelMetadata類型做爲承載,在得到屬性的ModelMetadata以後(還不知道怎麼獲取ModelMetadata的童鞋請自行惡補),咱們能夠輕鬆獲得一些咱們在模型中定義的特性,好比顯示名稱、是否只讀、是否必須、註釋、數據類型等,可是並不包括Range和StringLength這兩個須要驗證的特性,我把ModelMetadata對象翻個底朝天也沒找到設置的值。函數
因而乎,只能經過反射來獲取特性的定義信息了,如下代碼可以獲取到該屬性定義的全部特性:spa
var attrs = metadata.ContainerType.GetProperty(metadata.PropertyName).CustomAttributes;
而後咱們遍歷之,尋找咱們要的類型,這裏以Range爲例:code
foreach (var f in attrs) { if (f.AttributeType == typeof(RangeAttribute) && f.ConstructorArguments[0].ArgumentType != typeof(Type)) { //TODO:對其取值 } }
代碼中首先判斷類型是否一致,接着判斷第一個構造參數是否不爲Type類型(Range特性有三個構造函數,其中第一個參數爲Type類型的max和min值能夠是任何類型,在這裏咱們不需處理這個構造函數的數據,只對另外兩種傳輸int或double的構造函數感興趣)。對象
而後就能夠取值了:blog
double Min = ((IConvertible)f.ConstructorArguments[0].Value).ToDouble(null); double Max = ((IConvertible)f.ConstructorArguments[1].Value).ToDouble(null);
這裏咱們須要double類型的值,因此無論傳入的是int仍是double類型參數,統一使用轉換的方式轉換爲double。input
這樣咱們就能夠在發往客戶端頁面中進行基本的限制了:class
<input type="number" name="points" min="@Min" max="@Max" />
同理能夠取來StringLength的信息用來限制文本輸入框的可輸入字符長度:foreach
<input maxlength="@Length">
還能夠結合JS寫一些自定義的客戶端驗證。遍歷
服務端的模型驗證不用咱們操心,這兩個特性會在驗證時正確觸發的。meta
使用這個技巧,你還能夠實現一些自定義的特性,以控制客戶端的頁面功能。