我试图弄清楚如何让我的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。有人跑了吗?
答案 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;
}
}