C# 替换DataAnnotationsModelMetadataProvider并操作返回的ModelMetadata是否有效
我们目前正在使用MVC3构建一个中型intranet应用程序。一个要求是可以动态更改和翻译字段名称和标签。我们目前正在使用扩展版本的C# 替换DataAnnotationsModelMetadataProvider并操作返回的ModelMetadata是否有效,c#,asp.net-mvc,asp.net-mvc-3,metadata,C#,Asp.net Mvc,Asp.net Mvc 3,Metadata,我们目前正在使用MVC3构建一个中型intranet应用程序。一个要求是可以动态更改和翻译字段名称和标签。我们目前正在使用扩展版本的ViewPage、ViewMasterPage和ViewUserControl,通过spring.net注入的翻译助手来实现这一要求 此解决方案解决了除依赖于ModelMetadata(例如LabelFor)的MVC功能之外的所有需求。我的第一个想法是应该有一个扩展点来取代当前的实现。幸运的是,MVC团队构建了ModelMetadataProviders,这样我就可
ViewPage
、ViewMasterPage
和ViewUserControl
,通过spring.net注入的翻译助手来实现这一要求
此解决方案解决了除依赖于ModelMetadata
(例如LabelFor
)的MVC功能之外的所有需求。我的第一个想法是应该有一个扩展点来取代当前的实现。幸运的是,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;
}
受保护的重写ModelMetadata CreateMatadata(IEnumerable属性、类型containerType、Func modelAccessor、类型modelType、字符串propertyName)
{
//调用基本方法并获取元数据对象。
var metadata=base.CreateMetadata(属性、containerType、modelAccessor、modelType、propertyName);
if(containerType!=null)
{
//获取信息以查询翻译人员。
var objectName=containerType.FullName;
var displayName=metadata.GetDisplayName();
//询问翻译人员。
var translatedDisplayName=Translator.Translate(objectName,displayName);
//更新元数据。
metadata.DisplayName=translatedDisplayName;
}
返回元数据;
}
我使用containerType
和GetDisplayName()
作为键从翻译贡献者处获取翻译(使用缓存,不会降低性能),然后调用base并在返回之前更新DisplayName
属性来更改返回的ModelMetadata
让我对这个解决方案缺乏信心的是,我无法预测我必须预期的副作用是什么?或者如果有更好、合适的解决方案?是的,这是有效的用法 确保从
DataAnnotationsModelMetadataProvider
派生,就像重用它提供的所有功能一样
您还可以在此处处理更多自定义属性-您可以使用自己的自定义属性装饰您的模型,然后根据它们更新
ModelMetadata
。是的,这是有效的用法
确保从DataAnnotationsModelMetadataProvider
派生,就像重用它提供的所有功能一样
您还可以在此处处理更多自定义属性-您可以使用自己的自定义属性装饰您的模型,然后基于它们更新ModelMetadata
。根据Phil Haack和相关的bitbucket项目,此接缝是有效的。根据Phil Haack和相关的bitbucket项目,此接缝是有效的。