3 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
DisplayNameAttribute您可以為此目的繼承
public class DisplaySiteTextAttribute : DisplayNameAttribute
{
private string _key;
public DisplaySiteTextAttribute(string key)
{
_key = key;
}
public override string DisplayName
{
get
{
return TextManager.GetValue(_key);
}
}
}

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
有多種選項(xiàng)可用于自定義模型元數(shù)據(jù):
自定義框架提供元數(shù)據(jù)的方式。(創(chuàng)建
ModelMedatadaProvider
)創(chuàng)建新的元數(shù)據(jù)屬性。(實(shí)施
IMetadataAware
)修改現(xiàn)有屬性。(派生現(xiàn)有屬性。)
第三個(gè)選項(xiàng)已在其他答案中討論過(guò)。在這篇文章中,我將分享第一個(gè)和第二個(gè)選項(xiàng)。
選項(xiàng) 1 - 自定義框架提供元數(shù)據(jù)的方式
您可以更改獲取顯示文本的邏輯,而無(wú)需更改屬性。
事實(shí)上,它的責(zé)任是ModelMetaDataProvider
獲取模型的元數(shù)據(jù),包括屬性的顯示文本。因此,作為一種選擇,您可以保持Display
屬性不變,而是創(chuàng)建一個(gè)新的模型元數(shù)據(jù)提供程序并從不同的源返回屬性元數(shù)據(jù)。
為此,您可以通過(guò)派生自 來(lái)創(chuàng)建新的元數(shù)據(jù)提供程序DataAnnotationsModelMetadataProvider
。然后重寫GetMetadataForProperty
并調(diào)用base,以獲取元數(shù)據(jù)。然后DisplayName
根據(jù)您的邏輯通過(guò)閱讀文本管理器進(jìn)行更改。
您還需要注冊(cè)新的元數(shù)據(jù)提供程序,如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;
? ? }
}
然后將其注冊(cè)到Application_Start()
:
ModelMetadataProviders.Current?=?new?MyCustomModelMetadataProvider();
當(dāng)您想要更改為模型提供元數(shù)據(jù)的方式時(shí),此方法非常有用。例如,當(dāng)您想要從外部文件而不是資源加載顯示名稱和描述時(shí),而不更改現(xiàn)有屬性。
選項(xiàng) 2 - 創(chuàng)建新的元數(shù)據(jù)屬性
創(chuàng)建元數(shù)據(jù)感知屬性的另一個(gè)標(biāo)準(zhǔn)解決方案是創(chuàng)建屬性并實(shí)現(xiàn)IMetadataAware
接口。然后在實(shí)現(xiàn)中OnMetadataCreated
您可以輕松設(shè)置 的屬性metadata
。
這種方法不需要注冊(cè)新的元數(shù)據(jù)提供者。此方法受默認(rèn)元數(shù)據(jù)提供程序支持,對(duì)于創(chuàng)建新的元數(shù)據(jù)感知屬性非常有用:
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);
? ? }
}
當(dāng)您想要擴(kuò)展元數(shù)據(jù)屬性并添加更多屬性時(shí),此方法非常有用。例如,當(dāng)您想添加一些屬性來(lái)控制渲染時(shí)。您可以設(shè)置
ModelMetadata
屬性或向其AdditionalValues
字典添加一些新值。

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
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 關(guān)注
- 166 瀏覽
添加回答
舉報(bào)