我有一個自定義DataAnnotationsModelMetadataProvider
,我想返回一個從ModelMetadata
派生的對象,這樣我可以在我的剃鬚刀模板中具有額外的屬性。我該如何擴展DataAnnotationsModelMetadata
到目前爲止,我的定義提供只覆蓋了CreateMetadata
功能:
protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);
ModelMetadataAttribute mma;
foreach (Attribute a in attributes)
{
mma = a as ModelMetadataAttribute;
if (mma != null)
mma.Process(modelMetadata);
}
return modelMetadata;
}
使來自ModelMetadataAttribute
得出每個屬性都可以做一些自定義操作(實際上只增加了AdditionalValues
)
但是因爲幾乎所有的我的屬性主要爲我在剃刀模板中生成的html元素添加屬性,我希望視圖中的ModelMetadata
包含我想添加的屬性的字典(以及其他一些內容)。
所以,我需要從DataAnnotationsModelMetadata
繼承的類。
我不能只調用base.CreateMetadata
功能,因爲它不會正確地投給我的派生類。
我想到了製作由base.CreateMetadata
函數返回DataAnnotationsModelMetadata
公共屬性的副本到我的派生類,但我可以失去信息,這樣好像不安全,不。
我想到了另一種方式是複製/粘貼的CreateMetadata
基本代碼,並添加我的邏輯,但似乎醜陋......(我只擁有MVC3源,所以它可能在mvc4已經改變)
也想過從ViewDataDictionnary
繼承,這樣我可以提供我的自定義元數據類而不是標準之一,但我沒有一個關於如何做到這一點的線索。 (也承認我對這個問題並沒有太多的瞭解)
我看了很多關於DataAnnotations
和提供商的文章,但是找不到類似於我想要做的事情。
那麼,什麼是我選擇這裏?我可以向哪個方向尋找更接近我想要做的事情?
編輯:
我看了看這個問題(很相似):Can I achieve a 'copy constructor' in C# that copies from a derived class? 但它所做的工作屬性的副本,我想避免這種情況。 在這篇文章的最後答案還有一些關於PopulateMetadata
,但我無法找到基地提供該功能...
+1謝謝!我會深入研究。但是沒有注射的方法可以做同樣的事情嗎? mvcextensions似乎非常強大,但有很多事情我不需要使用。這是否意味着我需要重構所有實際的代碼,以便它使用mvcextension而不是標準的mvc機制? – ppetrov
@ppetrov mvcextensions需要用它的方法擴展你的HttpApplication,但沒有必要。您可以繼續使用DataAnnotations以及extensinos的流暢配置。這是一個開始指南:https://github.com/MvcExtensions/Core/wiki/Getting-started-with-MvcExtensions – Dima
我正在尋找這個鏈接,但我讀得挺快,實際上可能錯過了一些東西。不管怎樣,謝謝!我會等待一天,看看是否有另一種方式做到這一點(沒有mvcextensions或其他第三方庫),但如果沒有,我會去解決您的解決方案,因爲它解決了問題 – ppetrov