2013-11-20 27 views
1

我在實現System.Web.Mvc.IModelBinder的MVC中使用自定義模型綁定器。提取自定義ModelBinder中的數據註釋

模型聯編程序採用通用類型(類)提取每個類屬性並將它們存儲在List中以及有關每個屬性的其他詳細信息。例如,對於每個屬性,它存儲基於登錄用戶的每個屬性的訪問權限,即讀取,寫入,無。然後在我的視圖中,我使用這些附加數據來確定是否顯示特定的屬性。

我希望能夠檢索每個屬性的驗證數據註釋屬性並存儲這些細節。我想將它們存儲爲html屬性,我可以將其注入到用於稍後顯示屬性的控件中,如以下示例中所示。

<input data-val="true" data-val-length="Address1&#32;must&#32;be&#32;less&#32;than&#32;8!!" data-val-length-max="8" data-val-required="Address&#32;Line&#32;1&#32;is&#32;required." id="Entity_Address_AddressLine1" name="Entity.Address.AddressLine1" type="text" value="aaaa1111" /> 

我是否必須使用反射從類中提取數據註記屬性或者是否存在其他方法?如何將數據註釋輸出爲html屬性?

+0

這可能有助於... HTTP://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.validationattribute(V = vs.110)的.aspx –

+0

我不想創建一個新的Validation屬性現有的屬性是正確的,但由於我實現我的ModelBinder的方式,他們沒有傳遞到編輯器模板視圖。 – gisWeeper

回答

1

在這裏你去:

foreach (PropertyInfo prop in Model.GetType().GetProperties()) 
{ 
    var annotations = prop.GetCustomAttributes(typeof(ValidationAttribute), false); 
    foreach(var annotation in annotations) 
    { 
     if(annotation is RequiredAttribute) 
     { 
      //... 
     } 
    } 
} 
+0

謝謝DZL我正在這樣做,但由於我如何實施我的mvc解決方案,這可能不適用。我傾向於使用自定義的DataAnnotationsModelMetadataProvider將註釋添加到屬性的元數據 - 不確定它是否適用於我的實現! – gisWeeper

+0

@gisWeeper我很好奇這種差異會如何使答案不適用。我正在尋找類似的東西,並希望確保我不會錯過任何東西。也許你可以擴大你的問題? –

0

要做到這一點,我實現了自定義DataAnnotationsModelMetadataProvider(MpMetaDataProvider),我註冊和使用MVC。 您在在Global.asax

ModelMetadataProviders.Current = new MpMetaDataProvider(); 

在我MpMetaDataProvider我叫下面的方法返回數據註釋特定類的特定屬性Application_Start事件註冊。我希望這可以幫助別人。

this.GetMetadataForProperty(modelAccessor, modelProperty.Parent.EntityType, modelProperty.Name);