2011-07-08 44 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。然后,其他模型可以适用于复杂页面。