c#mvc model vs viewbag

时间:2011-07-08 14:23:52

标签: c# asp.net-mvc partial-views viewbag

假设您在页面中有人员A列表和人员B列表。这两个是L2S中的单独类,代表两个不同的表。因此,您无法按如下方式传递单个模型:

...
@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#方式来做我想要的?

5 个答案:

答案 0 :(得分:17)

创建特定于页面的ViewModel,因为您选择3就是我的方式。

我相信这也是推荐的方法。

答案 1 :(得分:8)

不,没有更好的主意。在asp.net MVC中,M代表ViewModels,而不是Business,Domain模型。建议您为视图创建ViewModel,并且不建议使用Business Models。您应该设计ViewModel以满足控制器与Domain交互的需要,以及从控制器到查看交互的需要

答案 2 :(得分:2)

我会以第三种方式做到这一点。另外,如果你要为两个数组中的每个人渲染相同的html,我会在foreach之前将它们连接起来:

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

答案 3 :(得分:2)

您的第一个和第三个选项似乎都可以。

ad 1)“只使用它们一次”并不是一个好的论据。使用部分视图来组织视图。

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

ad 3)ViewModels在MVC中变得普遍。这可能是最好的方法。

答案 4 :(得分:2)

我通常会为页面创建一个模型,并将其命名为,例如AccountDetailsPageModel。然后其他模型可以适用于复杂页面。