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 關注
- 158 瀏覽
添加回答
舉報