2012-09-10 39 views
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)[email protected](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框架內完成的嗎? 我在網絡上看到的所有教程處理更簡單的數據。任何人都可以指向一些示例代碼/教程來處理這樣的事情嗎?

在此先感謝!

+0

您的代碼引用'PackageName1'和'Food1'但我CA在控制器的操作方法中沒有看到。如果您不從方法返回匿名類型,也可以避免出現問題。相反,定義一個獨立的ViewModel類,這樣你就可以確定你正在處理的是什麼。 – Dai

回答

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;} 
} 

,並在你的獲取動作視圖模型,你需要做的總從您的數據,從數據訪問層ccoming並填寫到視圖模型列表

數據
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> 
} 
+1

優秀的回覆@Shyju。作爲一個方面說明,您可以通過創建一個具有List Packages屬性的PackageListViewModel來改善您的'視圖模型體驗'。在視圖上使用PackageListViewModel。 – MisterJames

+0

@MisterJames:完全同意。由於這個視圖不需要包和其子項列表以外的其他任何東西,所以我沒有創建這樣的一個。另外,我不希望OP通過看到這麼多的類來猶豫不決地看着ViewModel方法。 – Shyju

+0

@Shyju。不知道你是否會看到我發佈在這個主題上的第二個問題,所以我想在這裏發表評論。請檢查下面的問題...我仍然遇到麻煩。謝謝!! –