3 回答
TA贡献1796条经验 获得超10个赞
DisplayNameAttribute您可以为此目的继承
public class DisplaySiteTextAttribute : DisplayNameAttribute
{
private string _key;
public DisplaySiteTextAttribute(string key)
{
_key = key;
}
public override string DisplayName
{
get
{
return TextManager.GetValue(_key);
}
}
}
TA贡献1852条经验 获得超1个赞
有多种选项可用于自定义模型元数据:
自定义框架提供元数据的方式。(创建
ModelMedatadaProvider
)创建新的元数据属性。(实施
IMetadataAware
)修改现有属性。(派生现有属性。)
第三个选项已在其他答案中讨论过。在这篇文章中,我将分享第一个和第二个选项。
选项 1 - 自定义框架提供元数据的方式
您可以更改获取显示文本的逻辑,而无需更改属性。
事实上,它的责任是ModelMetaDataProvider
获取模型的元数据,包括属性的显示文本。因此,作为一种选择,您可以保持Display
属性不变,而是创建一个新的模型元数据提供程序并从不同的源返回属性元数据。
为此,您可以通过派生自 来创建新的元数据提供程序DataAnnotationsModelMetadataProvider
。然后重写GetMetadataForProperty
并调用base,以获取元数据。然后DisplayName
根据您的逻辑通过阅读文本管理器进行更改。
您还需要注册新的元数据提供程序,如ModelMetadataProviders.Current
中所示App_Start
。
using System;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web.Mvc;
public class MyCustomModelMetadataProvider : DataAnnotationsModelMetadataProvider
{
protected override ModelMetadata GetMetadataForProperty(Func<object> modelAccessor,
Type containerType,
PropertyDescriptor propertyDescriptor)
{
var metadata = base.GetMetadataForProperty(modelAccessor,
containerType, propertyDescriptor);
var display = propertyDescriptor.Attributes
.OfType<DisplayAttribute>().FirstOrDefault();
if (display != null)
{
metadata.DisplayName = TextManager.GetValue(display.Name);
}
return metadata;
}
}
然后将其注册到Application_Start()
:
ModelMetadataProviders.Current = new MyCustomModelMetadataProvider();
当您想要更改为模型提供元数据的方式时,此方法非常有用。例如,当您想要从外部文件而不是资源加载显示名称和描述时,而不更改现有属性。
选项 2 - 创建新的元数据属性
创建元数据感知属性的另一个标准解决方案是创建属性并实现IMetadataAware
接口。然后在实现中OnMetadataCreated
您可以轻松设置 的属性metadata
。
这种方法不需要注册新的元数据提供者。此方法受默认元数据提供程序支持,对于创建新的元数据感知属性非常有用:
using System;
using System.Web.Mvc;
public class CustomMetadataAttribure : Attribute, IMetadataAware
{
public string Key { get; set; }
public CustomMetadataAttribure(string key) => this.Key = key;
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.DisplayName = TextManager.GetValue(this.Key);
}
}
当您想要扩展元数据属性并添加更多属性时,此方法非常有用。例如,当您想添加一些属性来控制渲染时。您可以设置
ModelMetadata
属性或向其AdditionalValues
字典添加一些新值。
TA贡献1806条经验 获得超8个赞
using System;
using System.Web.Mvc;
public class CustomMetadataAttribure : Attribute, IMetadataAware
{
public string Key { get; set; }
public CustomMetadataAttribure(string key) => this.Key = key;
public void OnMetadataCreated(ModelMetadata metadata)
{
metadata.DisplayName = TextManager.GetValue(this.Key);
}
}
- 3 回答
- 0 关注
- 124 浏览
添加回答
举报