如何在列表的强类型视图上使用LabelFor

时间:2011-07-15 06:14:23

标签: c# asp.net-mvc-3 razor

当我使用asp.net mvc 3脚手架制作清单时。我有一个包含表格的视图。该表的标题在视图中硬编码。我想使用LabelFor,所以我得到了我需要的l10n。

我尝试做的事情(但失败了)是:

@model IEnumerable<User>
<table>
 <tr>
   <th>
      @(Html.LabelFor<User, string>(model => model.Name)) <!--This line errors-->
   </th>
 </tr>

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

错误“IEnumerable不包含Name的定义”等等......

我如何使这项工作?

4 个答案:

答案 0 :(得分:19)

尝试使用

@(Html.LabelFor<User, string>(model => model.FirstOrDefault().Name))

答案 1 :(得分:5)

您的视图模型不适合您要实现的目标。以下是更好的视图模型的样子:

public class MyViewModel
{
    // This property represents the header value
    // you could use data annotations to localize it
    [Display(.. some localization here ..)]
    public string NameHeader { get; set; }

    // This property represents the data source that 
    // will be used to build the table
    public IEnumerable<User> Users { get; set; }
}

然后:

@model MyViewModel
<table>
    <tr>
        <th>
            @Html.LabelFor(x => x.NameHeader)
        </th>
    </tr>

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

使用显示模板,您甚至不需要编写foreach循环:

@model MyViewModel
<table>
    <tr>
        <th>
            @Html.LabelFor(x => x.NameHeader)
        </th>
    </tr>
    @Html.DisplayFor(x => x.Users)
</table>

并在自定义显示模板(~/Views/Shared/DisplayTemplates/User.cshtml)内:

@model User
<tr>
    <td>@Html.DisplayFor(x => x.Name)</td>
</tr>

答案 2 :(得分:0)

您在foreach迭代之前(或之外)呈现Label,因此您尝试访问不存在的IEnumerable集合中的Name属性。

答案 3 :(得分:0)

改为使用DisplayNameFor @ Html.DisplayNameFor(model => model.Name)