在模型中循环列表时使用DisplayNameFor和DisplayFor

时间:2013-12-30 19:36:51

标签: c# asp.net-mvc asp.net-mvc-4 viewmodel

我创建了一个ViewModel,我将其用作视图的模型。在视图模型中,它包含以下定义:

public class ItemDetailViewModel
{
    public int ItemId { get; set; }
    public bool Active { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public List<ItemDetailItemOptionViewModel> ItemOptions { get; set; }
}

如您所见,它包含一个List&lt;&gt;名为ItemOptions。我的视图模型与ItemDetailViewModel绑定。在视图中,我循环遍历列表中的每个元素并输出它们:

@model app1.Models.ViewModels.ItemDetailViewModel

@{
    ViewBag.Title = "Item " + @Html.DisplayFor(model => model.ItemId);
}

//...
<thead>
    <tr>
        <th>Active</th>
        <th>Names</th>
    </tr>
</thead>
<tbody>
    @foreach (app1.Models.ViewModels.ItemDetailItemOptionViewModel ItemOption in Model.ItemOptions)
    {
        <tr>
            <td>@ItemOption.Active</td>
            <td>@ItemOption.Name</td>
        </tr>
    }
</tbody>
//...

我希望能够做的不是对名称和值进行硬编码,而是希望能够使用我在页面内使用的其他帮助程序,例如:

@Html.DisplayNameFor(model => model.ItemCode)
@Html.DisplayFor(model => model.ItemCode)

我尝试了以下

@Html.DisplayNameFor(model => model.ItemOptions.ItemCode)
@Html.DisplayFor(model => model.ItemOptions.ItemCode)

但这会产生以下错误:

  

错误1'System.Collections.Generic.List&lt; [] .Modes.ViewModels.ItemDetailItemOptionViewModel&gt;'   不包含'ItemCode'的定义,也没有扩展方法   'ItemCode'接受第一个类型的参数   'System.Collections.Generic.List&LT; [] Models.ViewModels.ItemDetailItemOptionViewModel&GT;'   可以找到(你错过了使用指令或程序集   参考?).... \ Views \ Item \ Details.cshtml 87 81 []

我也试过从我循环的ItemOption对象开始,但得到类似的问题。我做错了什么?

1 个答案:

答案 0 :(得分:3)

ItemOptionsList<>,因此它本身没有ItemCode的定义。但是,该列表中的任何元素都可以。像这样:

@Html.DisplayNameFor(model => model.ItemOptions.First().ItemCode)
@Html.DisplayFor(model => model.ItemOptions.First().ItemCode)

首先,如果列表没有元素,这可能看起来可能会引发错误,但它是视图引擎的一个怪癖,它实际上并没有调用 .First()在列表中,它只是使用引用来确定它收集信息的类型。在这种情况下,First()返回的类型为ItemDetailItemOptionViewModel,因此它会从该类型中获取所需的元数据。