Допустимо ли заменить DataAnnotationsModelMetadataProvider и манипулировать возвращенными ModelMetadata
В настоящее время мы создаем интранет-приложение среднего размера с использованием MVC3. Одним из требований является возможность изменять и переводить имена полей и метки на лету. В настоящее время мы используем расширенные версии ViewPage
, ViewMasterPage
а также ViewUserControl
обогащенный помощником по переводу, добавляемым spring.net для выполнения этого требования.
Это решение отвечает всем требованиям, кроме функций MVC, которые основаны на ModelMetadata
(например LabelFor
). Моей первой мыслью было, что должна быть точка расширения, чтобы заменить текущую реализацию. К счастью, сборка команды MVC ModelMetadataProviders
таким образом, что я могу внедрить пользовательский перевод с учетом DataAnnotationsModelMetadataProvider
,
protected override ModelMetadata CreateMetadata( IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName )
{
// Call the base method and obtain a metadata object.
var metadata = base.CreateMetadata( attributes, containerType, modelAccessor, modelType, propertyName );
if( containerType != null )
{
// Obtain informations to query the translator.
var objectName = containerType.FullName;
var displayName = metadata.GetDisplayName();
// Query the translator.
var translatedDisplayName = Translator.Translate( objectName, displayName );
// Update the metadata.
metadata.DisplayName = translatedDisplayName;
}
return metadata;
}
Я использую containerType
а также GetDisplayName()
в качестве ключа для получения перевода от автора перевода (который использует кэширование, не снижает производительность), затем вызывает base и изменяет возвращаемый ModelMetadata
обновив DisplayName
собственность перед возвратом.
Что делает меня неуверенным в этом решении, так это то, что я не могу предсказать, какие побочные эффекты мне ожидать? Или, если есть лучшее, правильное решение?
1 ответ
Да, это допустимое использование.
Убедитесь, что вы производите от DataAnnotationsModelMetadataProvider
как вы делаете, чтобы повторно использовать все функции, которые он предоставляет.
Вы также можете обрабатывать больше пользовательских атрибутов здесь - вы можете украсить свою модель своими собственными пользовательскими атрибутами, а затем обновить ModelMetadata
на их основе.