亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

C#
泛舟湖上清波郎朗 2023-08-20 10:17:51
我有以下方法從鍵值 XML 文件中讀取數據。我傳入一個鍵并返回一個我曾經在視圖上顯示的值。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;    }}基本上,我希望能夠在我的模型類中使用此方法作為數據注釋,它將直接從我的站點文本文件中提取并設置為顯示名稱屬性。例如我想替換[Display(Name = "Reference Code")]public string ReferenceCode { get; set; }有了這個[DisplaySiteText("ReferenceCodeKey")]public string ReferenceCode { get; set; }DisplaySiteText 會將字符串引用“ReferenceCodeKey”傳遞給 GetValue 方法,將引用歸檔到文件中,然后將標準顯示名稱屬性設置為文件中的任何內容。如何創建自己的自定義模型注釋來執行此操作,我過去通過創建繼承自 ValidationAttribute 的類來編寫自定義驗證注釋,但我認為這在這種情況下不起作用。
查看完整描述

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

        }

    }

}


查看完整回答
反對 回復 2023-08-20
?
小怪獸愛吃肉

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



查看完整回答
反對 回復 2023-08-20
?
慕森卡

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

    }

}


查看完整回答
反對 回復 2023-08-20
  • 3 回答
  • 0 關注
  • 158 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號