第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

使用自定義功能覆蓋 MVC 模型顯示名稱注釋

使用自定義功能覆蓋 MVC 模型顯示名稱注釋

C#
泛舟湖上清波郎朗 2023-08-20 10:17:51
我有以下方法從鍵值 XML 文件中讀取數(shù)據(jù)。我傳入一個(gè)鍵并返回一個(gè)我曾經(jīng)在視圖上顯示的值。public static class TextManager{    public static string GetValue(string key)    {        string returnVal = null;         XmlSerializer serializer = new XmlSerializer(typeof(Entries));        string path = HttpContext.Current.Server.MapPath("/App_Data/text-key-value.xml");        if (File.Exists(path))        {            Entries entries = (Entries)serializer.Deserialize(File.OpenRead(path));            var entry = entries.Where(u => u.Key == key).FirstOrDefault();            if (entry != null)            {                returnVal = entry.Value;            }        }        return returnVal;    }}基本上,我希望能夠在我的模型類中使用此方法作為數(shù)據(jù)注釋,它將直接從我的站點(diǎn)文本文件中提取并設(shè)置為顯示名稱屬性。例如我想替換[Display(Name = "Reference Code")]public string ReferenceCode { get; set; }有了這個(gè)[DisplaySiteText("ReferenceCodeKey")]public string ReferenceCode { get; set; }DisplaySiteText 會(huì)將字符串引用“ReferenceCodeKey”傳遞給 GetValue 方法,將引用歸檔到文件中,然后將標(biāo)準(zhǔn)顯示名稱屬性設(shè)置為文件中的任何內(nèi)容。如何創(chuàng)建自己的自定義模型注釋來(lái)執(zhí)行此操作,我過(guò)去通過(guò)創(chuàng)建繼承自 ValidationAttribute 的類來(lái)編寫自定義驗(yàn)證注釋,但我認(rèn)為這在這種情況下不起作用。
查看完整描述

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);

        }

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-08-20
?
小怪獸愛吃肉

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字典添加一些新值。



查看完整回答
反對(duì) 回復(fù) 2023-08-20
?
慕森卡

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);

    }

}


查看完整回答
反對(duì) 回復(fù) 2023-08-20
  • 3 回答
  • 0 關(guān)注
  • 166 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)