1

我不明白为什么我找不到任何清楚地解释如何使用 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 框架中完成的?我在网上/书籍中看到的所有教程都处理更简单的数据。谁能指出一些处理此类问题的示例代码/教程?

提前致谢!

4

1 回答 1

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>
}
于 2012-09-10T02:15:18.473 回答