【问题标题】:Incorporating custom view model data from multiple tables into a view将来自多个表的自定义视图模型数据合并到一个视图中
【发布时间】:2012-09-10 01:54:55
【问题描述】:

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

提前致谢!

【问题讨论】:

  • 您的代码引用了PackageName1Food1,但我在控制器的操作方法中看不到这一点。如果您不从方法返回匿名类型,您也将避免出现问题。而是定义一个单独的 ViewModel 类,这样您就可以确定您正在使用什么。

标签: asp.net-mvc-3 linq


【解决方案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>
}

【讨论】:

  • 优秀的回应@Shyju。作为旁注,您可以通过创建具有 List Packages 属性的 PackageListViewModel 来进一步改善您的“视图模型体验”。在您的视图上使用 PackageListViewModel。
  • @MisterJames:完全同意。由于这个视图除了包列表及其子项之外不需要任何其他东西,所以我没有创建一个这样的视图。另外,我不希望 OP 通过看到这么多类而犹豫着看 ViewModel 方法。
  • @Shyju。不确定您是否会看到我在此主题上发布的第二个问题,所以我想尝试在这里发表评论。请查看下面的问题...我仍然遇到问题。谢谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多