0

必要なビューのいくつかを構築するのに本当に役立つヘルパー メソッドの小さなコレクションがあります。それらはすべて非常にシンプルで効果的です (ただし、可能な限り最良の方法で実装されていない可能性があります)。ビューモデルのプロパティの1つからDisplayNameを使用してhtmlセグメントをレンダリングする必要がある、この1つのメソッド(「RenderTitleCell」)だけを実装するのに問題があります。

 <th>text obtained from DisplayName annotation of a model property</th>

問題は、「モデル プロパティの DisplayName アノテーションから取得したテキスト」を渡す方法が本当にわからないことです。これは、(記載されているように) プロパティのモデル クラスの display(name) アノテーションから取得されるためです。Html.DisplayNameFor は linq 式を受け取って同様のことを行いますが、この種のものをヘルパー メソッドに実装する方法が本当にわかりません。

これまでのところ、私のメソッドは < th > で出力する文字列を受け取るだけですが、ビューからプロパティの DisplayName を取得する方法がわからないため、これは実際にはあまり役に立ちません。クラスの注釈から切り離された文字列を使用します。

何か案は?

4

1 に答える 1

4

プロパティのメタデータから取得できます。

例:

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

    return new HtmlString(string.Format("<th>{0}</th>", html.Encode(name)));
}

その後:

@model MyViewModel
...
@Html.MyHelperFor(x => x.SomeProperty)

SomePropertyビュー モデルが[Display]または[DisplayName]属性で装飾されていると仮定します。

[DisplayName("foo bar")]
public string SomeProperty { get; set; }

また:

[Display(Name = "foo bar")]
public string SomeProperty { get; set; }

カスタムヘルパーは以下を生成します:

<th>foo bar</th>
于 2013-08-22T19:44:23.437 に答える