MVC传递viewmodel视图,视图模型包含父值和子列表

时间:2013-02-25 18:25:55

标签: asp.net-mvc linq entity-framework

我的应用程序在一个设施内有多个区域。我试图将单个模型传递给包含设施值(facility_id,facility_name)和区域列表的视图。我目前将区域列表作为表的实体模型类型(area_list)。

我的viewmodel如下:

 public class AreaView
{

    public string facility_name { get; set; }
    public int facility_id { get; set; }
    public int group_id { get; set; }

    public IList<area_list> areas { get; set; }

}

顺便说一句,我最初尝试将区域列表设置为单独的视图模型(AreaS)而不是模型area_list,但我还有其他问题,所以回到直接引用为简单起见。我假设这更合适......

我的控制器:

     public ActionResult List(int id = 0)
    {

        var model = (from f in areaDB.facility_list
                     where f.facility_id == id
                     select new AreaView
                     {
                         facility_id = f.facility_id,
                         facility_name = f.facility_name,
                         areas = (from a in areaDB.area_list
                                  orderby a.area_name
                                  where a.facility_id == id
                                  select a).ToList()
                     });

        return View(model);
    }

我的观点(缩写):

@model SkyeEnergy.Models.AreaView
Facility: @Model.facility_name
@foreach (var item in Model.areas) {
<tr>
    <td>
        @Html.ActionLink(item.vendor_name,"Details","Area",new {id = item.vendor_id},null)

    </td>

</tr>
}

我尝试过多种变体来完成下面的操作,这给了我很多错误,但最新的错误如下:

  

传递到字典中的模型项是类型的   'System.Data.Entity.Infrastructure.DbQuery`1 [MyApp.Models.AreaView]',   但是这个字典需要一个类型的模型项   'MyApp.Models.AreaView'。

据我所知,我没有为视图所期望的内容传递正确的类型,但我似乎无法弄明白:

  1. viewmodel是否在第一时间正确设置(如何混合值和子列表
  2. 如何构造我的linq查询以获取一个AreaView对象 我的所有数据
  3. 将它(正确的类型)传递给我 查看
  4. 我已经在Stackoverflow上阅读了大约45篇文章,但似乎无法将它们拼凑在一起以完成上述内容。如果有人有正确的解决方案(甚至是方向),我将非常感激。

    感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

我认为您应该在查询末尾添加FirstOrDefault()以返回AreaView

public ActionResult List(int id = 0)
{

    var model = (from f in areaDB.facility_list
                 where f.facility_id == id
                 select new AreaView
                 {
                     facility_id = f.facility_id,
                     facility_name = f.facility_name,
                     areas = (from a in areaDB.area_list
                              orderby a.area_name
                              where a.facility_id == id
                              select a).ToList()
                 }).FirstOrDefault();

    return View(model);
}

答案 1 :(得分:0)

我不会在同一个查询中组合这两个对象。我会做的

1)选择AreaView,其中id = xxxx

2)选择id = xxxx

的区域

3)将区域分配给我的AreaView

实施例

AreaView model = GetAreaView(id);

model.Areas = GetAreas(id);

return View(model);

另外,请针对当前代码尝试以下操作

return View(model.FirstOrDefault());