DisplayNameFor の IEnumerable オーバーロードを呼び出す [重複] 質問する

DisplayNameFor の IEnumerable オーバーロードを呼び出す [重複] 質問する

これはヘッダーを取得するために機能します(価値ではない):

@model IEnumerable<SomeModel>
...
<th>@Html.DisplayNameFor(m => m.SomeModelProperty)</th>

SomeModelProperty が次の場合:

[Display(Name = "An Excellent Header")]
SomeModelProperty { get; set; }

すると、ヘッダー要素に「優れたヘッダー」と表示されますth

モデルは IEnumerable であり、m.SomeModelProperty を持たないため、これは機能しないと思われるかもしれませんが、HtmlHelper には があり、HtmlHelper<IEnumerable<TModel>>ラムダのパラメータはTModelではなく であるため、機能しますIEnumerable<TModel>。これはメタデータを使用するだけなので、コレクションからの項目は必要ありません。(ただし、インテリセンスがm.オンになっていると、コレクションであると誤解されることがあります)。このクールなオーバーロードがいつ追加されたのかはわかりませんが、Index.cshtml には非常に便利で、@Html.DisplayNameFor(m => @Model.FirstOrDefault().SomeModelProperty)避けたい のような奇妙なものを排除します。

http://msdn.microsoft.com/en-us/library/hh833697(v=vs.108).aspx

しかし、モデルが IEnumerable ではなく、次のように IEnumerable をプロパティとして含んでいる場合に、これをどのように動作させるかがわかりません。

public class SomeList
{
   public List<SomeModel> SomeModels { get; set; }
   public int Page { get; set; }
   public DateTime CurrentAsOf { get; set; }
}

ジェネリック型パラメータを明示的に指定したいと思っていましたが、型パラメータはページで作成された HtmlHelper から派生したエンジンによって指定されていると思います。ページ内で新しい HtmlHelper を宣言したり、何らかの方法で型パラメータを明示的に指定したりすることはできますか?

インデックス.cshtml:

@model SomeList
//No idea how to do this:
@Html.DisplayNameFor<IEnumerable<SomeModel>>(m => m.SomeModelProperty)

ベストアンサー1

行がない場合でも機能する別の同様の回避策は次のとおりです。

...
@{var dummy = Model.FirstOrDefault(); }
    <tr>
        <th>
            @Html.DisplayNameFor(model => dummy.SomeModelProperty)
        </th>
...

おすすめ記事