如何在ASP.NET MVC2中使用和/或本地化DisplayAttribute?

时间:2010-03-25 16:45:20

标签: asp.net asp.net-mvc-2 data-annotations

  

可能重复:
  DisplayName attribute from Resources?

我试图弄清楚如何让我的MVC 2 ViewModel中的DisplayAttribute与Html.LabelFor()帮助器一起使用。

无论

public class TestModel
{
    [Display(ResourceType = typeof(Localization.Labels))]
    public string Text { get; set; }
}

,也不

public class TestModel
{
    [Display(Name = "test")]
    public string Text { get; set; }
}

似乎有效。本地化必需属性按预期工作:

[Required(ErrorMessageResourceName = "Test", ErrorMessageResourceType = typeof(Localization.Labels))]

我正在使用VS2010 RC。有人跑了吗?

3 个答案:

答案 0 :(得分:12)

[Display]属性是特定于.NET 4的属性。由于MVC 2是针对.NET 3.5编译的,因此运行时无法识别此属性。

有关更多信息和解决方法,请参阅http://aspnet.codeplex.com/WorkItem/View.aspx?WorkItemId=5515

修改

呃,工作项目不是那么大。也可以包括内联。 :)

  

[Display]属性是新的   DataAnnotations v4,因此MVC 2无法使用   因为我们编译反对   DataAnnotations v3.5。使用   [DisplayName]反而直到MVC 3,   我们将在哪里编译   DataAnnotations v4。

     

您有一些解决方法。当.NET   4个RTM,我们将提供一个.NET   4特定期货二元,那   期货二元将具有元数据   了解[显示]的提供商   和其他DataAnnotations v4特定的   属性。或者,如果您需要   一个解决方案,立即,子类   [DisplayName]属性,制作一个   private DisplayNameAttribute字段   这是适当的实例化,和   覆盖虚拟   DisplayNameAttribute.DisplayName   财产,以便委托给   _theWrappedDisplayNameAttribute.GetName()。

public class MultiCulturalDisplayName : DisplayNameAttribute {
  private DisplayAttribute display;

  public MultiCulturalDisplayName(Type resourceType, string resourceName) {
    this.display = new DisplayAttribute { ResourceType = resourceType, Name = resourceName };
  }

  public override string DisplayName {
    get { return display.GetName(); }
  }
}

答案 1 :(得分:3)

如果您下载ASP.NET MVC 2 Futures程序集,则可以使用DisplayAttribute。您只需将DataAnnotations4ModelMetadataProvider.RegisterProvider();添加到Global.asax.cs

即可

答案 2 :(得分:1)

Levi几乎回答了你的问题,而这里的记录是3.5

的工作版本
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class DisplayNameLocalizedAttribute : DisplayNameAttribute
{
    public DisplayNameLocalizedAttribute(Type resourceType, string resourceKey)
        : base(LookupResource(resourceType, resourceKey)) {  }

    internal static string LookupResource(Type resourceType, string resourceKey)
    {
        PropertyInfo property = resourceType.GetProperties().FirstOrDefault(p => p.PropertyType == typeof(System.Resources.ResourceManager));
        if (property != null)
        {
            return ((ResourceManager)property.GetValue(null, null)).GetString(resourceKey);
        }
        return resourceKey;
    }
}