Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 替换DataAnnotationsModelMetadataProvider并操作返回的ModelMetadata是否有效_C#_Asp.net Mvc_Asp.net Mvc 3_Metadata - Fatal编程技术网

C# 替换DataAnnotationsModelMetadataProvider并操作返回的ModelMetadata是否有效

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,这样我就可

我们目前正在使用MVC3构建一个中型intranet应用程序。一个要求是可以动态更改和翻译字段名称和标签。我们目前正在使用扩展版本的
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项目,此接缝是有效的。