C# 使用或继承ASP.NET MVC中的DisplayAttribute创建自定义显示属性

C# 使用或继承ASP.NET MVC中的DisplayAttribute创建自定义显示属性,c#,asp.net-mvc,C#,Asp.net Mvc,我想将DisplayAttribute与Name属性一起使用 问题是类是密封的,我不能继承它来重写某些方法 我为什么要这个 我想传递一些代码,以便将字符串转换为Name属性。并为语言添加一个属性 比如: [MyDisplay(Code = TRANSLATION_CODE, Language = "FR-FR")] public string Fr { get; set; } 在MyDisplayAttribute中,我想做如下操作: public class MyDisplayAttribu

我想将
DisplayAttribute
Name
属性一起使用

问题是类是密封的,我不能继承它来重写某些方法

我为什么要这个

我想传递一些代码,以便将字符串转换为
Name
属性。并为语言添加一个属性

比如:

[MyDisplay(Code = TRANSLATION_CODE, Language = "FR-FR")]
public string Fr { get; set; }
在MyDisplayAttribute中,我想做如下操作:

public class MyDisplayAttribute: DisplayAttribute // it won't work the inherits
{
     public int Code { get; set; }
     public string Language { get; set; }

    // somewhere, I don't know what method
    // I want to assing `Name = GetTranslation(Code, Language);`
}
还有别的办法吗


更新

我也试过:

public class MyDisplayAttribute : DisplayNameAttribute
   {
      private int _code;
      private string _language;

      public MyDisplayAttribute( int code, string language )
         : base( language )
      {
         _code = code;
         _language = language;
      }

      public override string DisplayName
      {
         get
         {
            // here come LanguageTranslatorManager
            if ( _code == 1 && _language == "en" ) {
               return "test";
            }

            return base.DisplayName;
         }
      }
   }
在模型中:

  [MyDisplay( 1, "en" )]
  public string Test
  {
     get;
     set;
  }
我希望在视图中显示
test
,但没有!
我的错误在哪里?

要为属性设置特定的显示名称,需要设置元数据属性
DisplayName
。如果需要编写自定义属性,则需要确保创建自定义元数据提供程序。在内部,您需要根据提供的值设置属性的
DisplayName

public class CustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
    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);

         if (attributes.OfType<MyDisplay>().ToList().Count > 0)
         {
              modelMetadata.DisplayName = GetValueFromLocalizationAttribute(attributes.OfType<MyDisplay>().ToList()[0]);
         }

         return modelMetadata;
    }

    private string GetValueFromLocalizationAttribute(MyDisplay attribute)
    {
          return computedValueBasedOnCodeAndLanguage;
    }
}
公共类CustomModelMetadataProvider:DataAnnotationsModelMetadataProvider { 受保护的重写ModelMetadata CreateMatadata(IEnumerable属性, 类型containerType,Func modelAccessor, 类型modelType,字符串propertyName) { var modelMetadata=base.CreateMetadata(属性、容器类型、, modelAccessor、modelType、propertyName); if(attributes.OfType().ToList().Count>0) { modelMetadata.DisplayName=GetValueFromLocalizationAttribute(attributes.OfType().ToList()[0]); } 返回模型元数据; } 私有字符串GetValueFromLocalizationAttribute(MyDisplay属性) { 返回基于代码和语言的计算值; } }
你做错了。DisplayAttribute已经使用内置的.net国际化支持“翻译”

 [Display(Name = "property_name", ResourceType = typeof(MyResources))]
只有在这还不够的情况下,才应该创建自己的属性,但不能从显示中派生

编辑:


DisplayAttribute
是一个密封的类,因此无法从中继承。

不,我想使用我的自定义翻译资源,不是从。netI试图做与OP相同的事情。我的目标是扩展DisplayAttribute,这样我就可以将ResourceType内容放在LocalizedDisplayAttribute中,而不必在模型中一直定义它。它不会覆盖
DisplayNameAttribute
的功能。它确实返回了预期的值,但没有将其绑定到元数据。您需要显式覆盖模型元数据中的值。由于您的问题是2年前提出的,您找到解决方案了吗?@ChristianGollhardt:不幸的是,没有,我创建了自定义属性,因为DisplayNameAttribute是密封的,无法继承。这也适用于WinForms吗?DataAnnotationsModelMetadataProvider位于System.Web中。ModelBinding@qub1n,我不确定。您必须引用所有涉及的名称空间,然后必须确保显式调用MetadataProvider。编写自己的轻量级“MetadataProvider”可能更容易。