我正在尝试在ASP.NET MVC索引视图中利用DataAnnotation值。有趣的是,代码生成器使用字段名称(例如,BlogPost)而不是Html.LabelFor(m => Model.ColumNames["BlogPost"])
或类似的东西(我编写了它)。
是否意味着,如果Model是IEnumerable(如在Index视图中),则无法获取DataAnnotation指定的Display Name?很难相信......
我的代码目前是MVC 2和MVC 3的混合,如果它有任何区别。
答案 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对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);