В настоящее время мы создаем интранет-приложение среднего размера с использованием 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
перед его возвратом.
Что неуверенно в этом решении, так эточто я не могу предсказать, какие побочные эффекты мне ожидать?Или, если есть лучшее, правильное решение?