web-dev-qa-db-ja.com

MVCビューのモデルからdisplayName属性にアクセスします

私のモデルが持っている場合

[DisplayName("First Name")]
public string firstName { get; set; }

その後、LabelForを使用してビューで印刷できます。

@Html.LabelFor(model => model.acc_first)

その後、次のようにレンダリングされます

<label for="firstName">First Name</label>
  • しかし、どのようにしてビューのプロパティ(FirstName)属性を「生」読み取ることができますか?たとえば、[表示]ページの関数に値を送信する場合
30
Joakim
@Html.DisplayNameFor(x => x.acc_first)
45
Darren Oster

属性にアクセスするには、カスタムHtmlヘルパーが必要です。属性は実際にはプロパティやモデルの一部ではないので、それらにアクセスする方法を一巡する必要があります。

public static IHtmlString DisplayName<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);

    return new HtmlString(metadata.DisplayName);
}

DataAnnotationsの一部ではない追加の属性については、次のことができます。

カスタム属性を作成する

public class TooltipAttribute : Attribute, IMetadataAware {
    public TooltipAttribute(string tooltip) {
        this.Tooltip = tooltip;
    }

    public string Tooltip { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata) {
        metadata.AdditionalValues["Tooltip"] = this.Tooltip;
    }
}

魔法はOnMetadataCreated実装で発生します。ここで、特定の属性に必要なものをAdditionalValuesに追加できます。この場合、ツールチップキーを追加しています。他の属性またはプロバイダが同じ名前の独自のキーを追加する可能性があるため、名前は一意である必要があります。属性は常に同じ順序で読み取られるわけではないことに注意してください。したがって、ツールチップ属性は、最初、最後、または中間のどこかで呼び出されます。これは、望ましくない効果を引き起こす可能性があるため、重要な違いです。

次に、カスタム属性ヘルパーを作成します

public static IHtmlString TooltipFor<TModel, TValue>(
                             this HtmlHelper<TModel> html,
                             Expression<Func<TModel, TValue>> expression) {
    var metadata = ModelMetadata.FromLambdaExpression<TModel, TValue>(expression, html.ViewData);
    if (metadata.AdditionalValues.ContainsKey("Tooltip"))
        return new HtmlString((string)metadata.AdditionalValues["Tooltip"]);

    return new HtmlString("");
}
13
Buildstarted

4つの手順で属性Display(Name="...")の値にアクセスできます。

var type = typeof(YourNamespace.Models.YourModelName);
var memInfo = type.GetMember("firstName"); // your member
var attributes = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false);
var displayname = ((System.ComponentModel.DataAnnotations.DisplayAttribute)attributes[0]).Name;

すると、displaynameの値はFirst Nameになります。

6
outofmind

ダレンオスターの答えに基づいて:

@Html.DisplayNameFor(x => x.acc_first)

このドキュメントへのリンクは次のとおりです。 https://msdn.Microsoft.com/en-us/library/system.web.mvc.html.displaynameextensions.displaynamefor(v = vs.118).aspx

次のようにビューコードでこれを使用できます。

@{ 
    var foo = Html.DisplayNameFor(x => x.acc_first);

    // call function
    DoStuff(foo);
}
3
bvpb

単に使用する必要があります

[Display(Name = "First Name")]


 public string name{ get; set; }
1
Manish Singh
<label asp-for="firstName">First Name</label>

asp-forに変更する必要があります

0
Mahdi Moeinifar