将来自多个表的自定义视图模型数据合并到视图中

时间:2012-09-10 01:54:55

标签: asp.net-mvc-3 linq

我无法理解为什么我找不到任何清楚解释如何使用MVC执行此操作的内容。看起来像一个很常见的问题:

我有三张桌子:

PackageName: PackageNameID,PackageName
Food: FoodID,Food
PackageContent: PackageContentID, PackageNameID, FoodID, Qty

该应用程序应该描述食品包装。例如,名为“A”的包可能包含4个洋葱和3个辣椒。另一个包装“B”可能包含2卷和2个洋葱。

目前我有一个收集数据的自定义视图模型(“PackageNameModel”):

public ViewResult Index() {
    var viewModel =
        from pn in db.PackageNames
        from pc in db.PackageContents
            .Where(p => p.PackageNameID == pn.PackageNameID).DefaultIfEmpty()
        from f in db.Foods
            .Where(f => f.FoodID == pc.FoodID).DefaultIfEmpty()
        select new PackageFoodModel { PackageName = pn, PackageContent = pc, Food = f };
    return View( viewModel );      
}

这会正确返回数据,但我该怎么做才能使视图实际上对应用程序有用?

在我看来使用它:

@foreach (var item in Model) {
<tr>
    <td>
        @Html.DisplayFor(modelItem => item.PackageName.PackageName1 ) , 
        @Html.DisplayFor(modelItem => item.Food.Food1)=@Html.DisplayFor(modelItem => item.PackageContent.Qty)
    </td>
    <td>
        @Html.ActionLink("Edit", "Edit", new { id=item.PackageName.PackageNameID }) |
        @Html.ActionLink("Details", "Details", new { id = item.PackageName.PackageNameID }) |
        @Html.ActionLink("Delete", "Delete", new { id = item.PackageName.PackageNameID })
    </td>
</tr>
}

我能够显示以下内容:

 - A , Onions=4  Edit | Details | Delete
 - A , Peppers=3  Edit | Details | Delete
 - B , Rolls=2  Edit | Details | Delete   
 - B , Onions=2  Edit | Details | Delete

这不是很有用。我要做的是显示如下:

 - A (Onions=4,Peppers=3)   Edit | Details | Delete
 - B (Rolls=2,Onions=2) Edit | Details | Delete

最后,导航到“编辑”操作后的下一页将为包提供一个可编辑的名称,以及所有可用食物和相邻数量框的表格,以便每个包装内的食物/数量可能是更新。

有人能解释一下这是如何在MVC框架内完成的吗? 我在网上/书中看到的所有教程都处理的数据要简单得多。任何人都可以向我指出一些处理类似事情的示例代码/教程吗?

提前致谢!

1 个答案:

答案 0 :(得分:1)

您需要汇总结果。

创建一个像这样的视图模型

public class PackageViewModel
{
  public int ID { set;get;}
  public string Name { set;get;}
  public List<FoodItem> FoodItems { set;get;}
  public PackageViewModel()
  {
     FoodItems=new List<FoodItem>();
  }
}
public class FoodItem
{
  public string FoodName { set;get;}
  public int Quantity { set;get;}
}

在您的Get操作中,您需要汇总数据中的数据,这些数据来自您的数据访问层并填充到ViewModel列表

public ActionResult IndeX()
{
  List<PackageViewModel> listVM=new List<PackageViewModel>();

   //Get your data and do aggregation and fill in listVM

  return View(listVm)l
}

在我们看来,

@model List<PackageViewModel>

@foreach(var item in Model)
{
  <tr>
   <td>@item.Name</td>
   <td>
       foreach(var food in item.FoodItems)
       {
         @food.FoodName - @food.Quantity
       }
   </td>
   <td>
      @Html.ActionLink("Edit","Edit",new {@id=item.ID})
   </td>
  </tr>
}