ASP.net MVC – 每个视图或每个动作一个ViewModel?

每个视图或每个控制器操作一个ViewModel是一个更好的主意吗?

例:

public ProjectController : Controller { public ActionResult Edit(int id) { var project = ...; return View(new ProjectEditViewModel(project)); } [HttpPost] public ActionResult Edit(ProjectEditViewModel model) { } **OR** [HttpPost] public ActionResult Edit(Project model) { } [HttpPost] public ActionResult Edit(ProjectEditPostViewModel model) { } } 

以下是三个选项,哪个最好?

  1. 对我的POST / GET操作使用相同的ViewModel。
  2. 将ViewModel用于我的GET操作,将我的域模型用于我的POST操作。
  3. 使用不同的ViewModel进行GET,使用不同的ViewModel进行POST。

为GET和POST操作使用不同的视图模型是最好和最灵活的设计。 但是对于GET和POST操作使用相同的视图模型也适用于90%的情况,这是一个很好的设计。 因此,如果在您的场景中使用相同的视图模型,请不要犹豫,像这样重用它。

在将不同的视图模型用于GET和POST操作的情况下,这些类之间仍然存在某种关系:inheritance或组合。

正确答案

都没有 。 没有银弹,不应该。

因此,正确答案是: 使用与用户界面流程要求一样多的视图模型 。 这与视图或控制器操作无关。

有时一个动作需要一个视图,另一个视图。 但是,不要遵循一些会妨碍您发展的严格指导方针。 在开发应用程序时,View模型将自然而然地出现。 而且应该。 否则,您最终可能会得出基于您已经确定的一些指导原则的不合理观点。

这实际上是与@ DarinDimitrov相似的答案,但直接得出结论。

使用不同的模型在Post动作中接收输入参数(在这种情况下我甚至不称它为ViewModel),而不是将输出参数传递给视图。

这样您就可以准确地自定义您接受的输入参数。

我遵循这种方法的基本forms:

  • GET的一种视图模型
  • POST的一个视图模型

GET模型inheritance了POST模型。

我经常将域对象传递给GET模型的构造函数,并用它做两件事:

  1. 使用域对象中的数据填充POST模型属性。
  2. 将域对象封装为GET模型中的局部变量。 我用它来显示域对象的一些(只读)数据。 节省一点力气。 有些人会告诉你不要这样做。