我创建了一个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对象开始,但得到类似的问题。我做错了什么?
答案 0 :(得分:3)
ItemOptions
是List<>
,因此它本身没有ItemCode
的定义。但是,该列表中的任何元素都可以。像这样:
@Html.DisplayNameFor(model => model.ItemOptions.First().ItemCode)
@Html.DisplayFor(model => model.ItemOptions.First().ItemCode)
首先,如果列表没有元素,这可能看起来可能会引发错误,但它是视图引擎的一个怪癖,它实际上并没有调用 .First()
在列表中,它只是使用引用来确定它收集信息的类型。在这种情况下,First()
返回的类型为ItemDetailItemOptionViewModel
,因此它会从该类型中获取所需的元数据。