これはヘッダーを取得するために機能します(価値ではない):
@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>
...