是否可以在Index视图中使用LabelFor作为标题行

时间:2011-01-17 01:44:39

标签: asp.net-mvc data-annotations

我正在尝试在ASP.NET MVC索引视图中利用DataAnnotation值。有趣的是,代码生成器使用字段名称(例如,BlogPost)而不是Html.LabelFor(m => Model.ColumNames["BlogPost"])或类似的东西(我编写了它)。

是否意味着,如果Model是IEnumerable(如在Index视图中),则无法获取DataAnnotation指定的Display Name?很难相信......

我的代码目前是MVC 2和MVC 3的混合,如果它有任何区别。

2 个答案:

答案 0 :(得分:15)

至少,你应该能够通过使用局部视图(ascx for WebForms)或显示/编辑器模板来获得你想要的东西。在索引页面中,您可以遍历可枚举项,并将项目传递到局部视图或模板中。

可能有一种方法可以做到这一点,而没有像我建议的那样(我会有兴趣看到答案),但我建议的应该可以正常工作。

编辑:

经过一些澄清后,这是我更新的答案。

您仍然可以获取属性的标签,同时仍然尊重数据注释中的DisplayAttribute。我试过这个很快,似乎工作得很好。

在我看来,我有以下内容:

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

即使枚举本身没有任何项目,这也有效。当我第一次测试这个时,我获得了属性名称,然后我添加了使用DisplayAttribute修饰的属性,并显示了name属性的值而不是标准属性名称。

答案 1 :(得分:5)

在MVC 4中,HtmlHelper extensions in the DisplayNameExtensions class允许以下内容(这是列标题列表的默认支架)

@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对TModelIEnumerable<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);
相关问题