我想将DisplayAttribute
与Name
属性一起使用。
问题是类是sealed
而我无法继承它来覆盖某些方法。
为什么我要这个?
我想传递一些代码,以便将字符串转换为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
,但不是!
我的错误在哪里?
答案 0 :(得分:2)
要为您的媒体资源设置特定的显示名称,您需要设置元数据属性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;
}
}
答案 1 :(得分:2)
你做错了。 DisplayAttribute已经使用内置的.net国际化
支持“翻译” [Display(Name = "property_name", ResourceType = typeof(MyResources))]
只有当这还不够时,您才应该创建自己的属性,而不是从显示中派生。
修改强>
DisplayAttribute
是一个密封的类,所以没有办法继承它。