【发布时间】:2017-04-24 12:43:47
【问题描述】:
我编写了一个代码,如下所示:
ViewBag.Items = user.Items.GroupBy(x => x.ItemId).Select(pr => new
{
ItemId = pr.Key,
ImageURL = pr.Select(x=>x.ImageURL).FirstOrDefault(),
Title = pr.Select(x=>x.Title).FirstOrDefault(),
Sales = pr.Select(x=>x.Transactions.Sum(y=>y.QuantitySold))
}).ToList();
如您所见,它是一个匿名对象列表...我现在要做的是将这些值绑定到我已经存在的视图中,如下所示:
<tbody>
@if (ViewBag.Items != null)
{
foreach (var item in ViewBag.Items)
{
<tr>
<td><img src="@item.ImageURL" /></td>
<td>@item.Title</td>
<td>@item.Sales</td>
</tr>
}
}
</tbody>
但是我收到了这个错误:
Additional information: 'object' does not contain a definition for 'ImageURL'
对于其他属性也是如此......
我该如何解决这个问题,但同时避免创建额外的类,这会使视图强类型..有人可以帮我吗?
【问题讨论】:
-
为此,您需要强制转换为动态
foreach(dynamic item in...,但创建自定义类比使用匿名类要好得多。 -
通过使用动态,您将依赖运行时类型检查而不是编译时间。强类型是 C# 的一大优点。
-
@User987 因为自定义类更易于使用,并且提供了您期望的属性存在的安全性。如果您需要更改内容,您可能会忘记在视图中进行更改。
-
创建一个视图模型(但作为一个糟糕的选择,您可以使用
dynamic- 参考this answer 或使用非类型化的HtmlHelper方法 - 参考this answer) -
如果您希望能够将此视图与多个具有相同属性集的类一起使用,则始终可以使用接口。
标签: c# asp.net asp.net-mvc razor asp.net-mvc-5