2011-07-08 37 views
11

假設您有一個人A的列表和一個人B在一個頁面中的列表。這兩個是L2S中的單獨班級,代表兩個不同的表格。因此,如下您無法通過單一的模式:c#mvc模型vs viewbag

... 
@model PeopleA 
... 
@foreach(var peopleA in Model.People) ... 

@foreach(var peopleB in //what?) 

因此,我想,我有三種選擇跟隨。

  • 第一個是將頁面劃分爲部分視圖,以便我可以通過RenderAction助手傳遞模型。由於我只會使用這些局部視圖,因此這個選項似乎對我沒有吸引力。
  • 第二個選擇是使用ViewBags,我不想,因爲我更喜歡強類型模型。
  • 最後一個,最後,我正要使用,但想這樣做之前要問,是創建一個模型,如下所示:

ModelMyPage.cs

public List<PeopleA> peopleA { get; set; } 
public List<PeopleB> peopleB { get; set; } 

myController的。 cs

... 
ModelMyPage m = new ModelMyPage(); 
m.peopleA = // query 
m.peopleB = // another query 
return(m); 

你明白了。這是完成我的任務的有效方式,還是有更好的C#方式來做我想做的事情?

回答

17

創建一個特定於該頁面的ViewModel,因爲您的選項3是我會這樣做的方式。

我相信這也是推薦的方法。

2

我會這樣做的第三種方法。此外,如果你要呈現相同的HTML中的每個人都陣列,我想的foreach之前Concat的他們:

var person in Model.PeopleA.Concat(Model.PeopleB) 
2

你的第一個和第三個選項似乎都OK。

ad 1)「僅使用它們一次」並不是一個好的論據。使用部分視圖來組織視圖。

ad 2)使用Viewbag添加查找列表等小項目。

ad 3)ViewModels在MVC中變得很普遍。這可能是最好的方法。

8

不,沒有更好的主意。在asp.net MVC中,M代表ViewModels,而不是商業,域模型。建議爲您的視圖創建ViewModel,並且不建議使用商業模型。您應該設計您的ViewModel以適應控制器與域交互以及從控制器到視圖交互的需求

2

我通常爲頁面創建一個模型,並將其命名爲AccountDetailsPageModel。然後,其他模型可以適用於複雜頁面。