这是我的问题: 我有一个数据库,我有一个有一些设备的表设备,每个设备都有一个类型。 我想查看表格中每种类型的设备数量。 我现在所拥有的是,在控制器中:
public ActionResult Stock()
{
var device = db.Device.Where(s => s.Status.ToUpper().Contains("Stock")).GroupBy(d => d.DeviceTypeName);
return View(device.ToList());
}
在视图中我有:
@model IEnumerable<System.Linq.IGrouping<System.String, Mobile_Inventory.Models.Device>>
<table>
<tr>
<th>
DeviceType
</th>
<th>
Qt
</th>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(modelItem => item.Key)
</td>
<td>
</td>
</tr>
}
</table>
但是这样我只能看到设备的类型,而不是数量。
我尝试将var设备更改为数量:
var device = db.Device.Where(s => s.Status.ToUpper().Contains("Stock")).GroupBy(d => d.DeviceTypeName).Select( d => new
{
Type = d.Key,
Count = d.Count()
} );
但是这样我会向视图返回一个匿名类型并得到错误:
传递到字典中的模型项的类型为'System.Collections.Generic.List
1[<>f__AnonymousType2
2 [System.String,System.Int32]]',但此字典需要类型为'System的模型项.Collections.Generic.IEnumerable1[System.Linq.IGrouping
2 [System.String,Mobile_Inventory.Models.Device]]”。
不知道如何更改视图的模型类型接受匿名类型,并且不知道它是否可能。任何人都可以提供解决方案吗?
答案 0 :(得分:1)
像这样创建一个ViewModel:
public class DeviceGroupViewModel
{
public string Type { get; set; }
public int Count { get; set; }
}
然后,将您的操作更改为:
public ActionResult Stock()
{
var devices = db.Device.Where(s => s.Status.ToUpper().Contains("Stock"))
.GroupBy(d => d.DeviceTypeName)
.Select(d => new DeviceGroupViewModel
{
Type = d.Key,
Count = d.Count()
}).ToList();
return View(devices);
}
而且,在您的视图中,您将拥有:
@model IEnumerable<Mobile_Inventory.ViewModels.DeviceGroupViewModel>
<table>
<tr>
<th>
DeviceType
</th>
<th>
Qt
</th>
</tr>
@foreach (var item in Model) {
<tr>
<td>
@Html.DisplayFor(item => item.Type)
</td>
<td>
@Html.DisplayFor(item => item.Count)
</td>
</tr>
}