Можно ли использовать LabelFor для строки заголовка в представлении индекса - PullRequest
5 голосов
/ 17 января 2011

Я пытаюсь использовать значения DataAnnotation в представлении индекса ASP.NET MVC. Интересно, что генератор кода использует имена полей (например, BlogPost), а не Html.LabelFor(m => Model.ColumNames["BlogPost"]) или что-то подобное (я это придумал).

Означает ли это, что если модель имеет IEnumerable (как в представлении индекса), то невозможно получить отображаемое имя, указанное в DataAnnotation? Трудно поверить ...

Мой код в настоящее время представляет собой смесь MVC 2 и MVC 3, если это имеет какое-либо значение.

Ответы [ 2 ]

15 голосов
/ 17 января 2011

Вы должны, по крайней мере, иметь возможность получить то, что вы хотите, используя частичное представление (ascx для WebForms) или шаблон отображения / редактора.На вашей странице индекса вы можете перебрать все перечисляемые и передать элемент либо в частичное представление, либо в шаблон.

Может быть способ сделать это без необходимости делать то, что я предложил (и я быинтересно увидеть ответ), но то, что я предложил, должно работать нормально.

РЕДАКТИРОВАТЬ:

После некоторых разъяснений, вот мой обновленный ответ.

Вы все еще можетеполучить метку для свойства при соблюдении DisplayAttribute в аннотациях данных.Я попробовал это очень быстро, и, похоже, он работает нормально.

На мой взгляд, у меня есть следующее:

Html.LabelFor(m => m.BlogPosts.First().BlogPostTitle)

Это сработало, даже если в самом перечислении не было элементов.Когда я впервые проверил это, я получил имя свойства, затем я добавил, украсил свойство DisplayAttribute, и вместо стандартного имени свойства отобразилось значение свойства name.

5 голосов
/ 09 ноября 2012

В MVC 4 расширения HtmlHelper в классе DisplayNameExtensions позволяют следующее (это леса по умолчанию для списка с заголовками столбцов)

@model IEnumerable<Entity.Foo>

<table>
    <tr>
        <th>
            @Html.DisplayNameFor(model => model.Bar)
        </th>
    </tr>

@foreach (var item in Model) {
    <tr>
        <td>
            @Html.DisplayFor(modelItem => item.Bar)
        </td>
...

Это связано с тем, что DisplayNameFor имеетперегрузки для TModel и IEnumerable<TModel>:

    public static MvcHtmlString DisplayNameFor<TModel, TValue>
                       (this HtmlHelper<IEnumerable<TModel>> html, 
                        Expression<Func<TModel, TValue>> expression);
    public static MvcHtmlString DisplayNameFor<TModel, TValue>
                       (this HtmlHelper<TModel> html, 
                        Expression<Func<TModel, TValue>> expression);
...