计算一个类型的元素数量并返回视图MVC C#

时间:2013-11-26 19:46:09

标签: c# asp.net-mvc asp.net-mvc-4 group-by

这是我的问题: 我有一个数据库,我有一个有一些设备的表设备,每个设备都有一个类型。 我想查看表格中每种类型的设备数量。 我现在所拥有的是,在控制器中:

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.IEnumerable 1[System.Linq.IGrouping 2 [System.String,Mobile_Inventory.Models.Device]]”。

不知道如何更改视图的模型类型接受匿名类型,并且不知道它是否可能。任何人都可以提供解决方案吗?

1 个答案:

答案 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>
}