13

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

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

@foreach(var peopleB in //what?)

因此,我想,我有三个选择。

  • 第一个是将页面划分为部分视图,以便我可以通过RenderAction帮助程序传递模型。因为我只会在这个选项对我没有吸引力时才使用这些部分视图。
  • 第二种选择是使用我不想使用的 ViewBags,因为我更喜欢强类型模型。
  • 最后一个,我即将使用但在这样做之前想问的最后一个是创建一个模型,如下所示:

模型MyPage.cs

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

我的控制器.cs

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

你明白了。这是完成我的任务的有效方法,还是有更好的 c# 方法来做我想做的事?

4

5 回答 5

18

创建特定于页面的 ViewModel,因为您的选项 3 是我会这样做的方式。

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

于 2011-07-08T14:25:58.673 回答
8

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

于 2011-07-08T14:31:38.667 回答
3

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

广告 1)“只使用一次”不是一个很好的论据。使用局部视图来组织视图。

广告 2) 使用 Viewbag 添加小项目,如查找列表。

广告 3) ViewModel 在 MVC 中(变得)很常见。这可能是最好的方法。

于 2011-07-08T14:29:29.753 回答
2

我会做第三种方式。此外,如果您要为两个数组中的每个人呈现相同的 html,我会在 foreach 之前连接它们:

var person in Model.PeopleA.Concat(Model.PeopleB)
于 2011-07-08T14:29:26.083 回答
2

我通常为页面创建一个模型,并将其命名为,例如AccountDetailsPageModel。然后其他模型可以是复杂页面的属性。

于 2011-07-08T14:33:59.307 回答