Это работает для захвата заголовков (NOT VALUES):
@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>
. Поскольку это просто использует метаданные, нет необходимости в элементе из коллекции. (Хотя intellisense на 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 на странице или каким-либо образом указать параметры типа явно?
Index.cshtml:
@model SomeList
//No idea how to do this:
@Html.DisplayNameFor<IEnumerable<SomeModel>>(m => m.SomeModelProperty)