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

时间:2011-09-13 19:48:55

标签: c# .net asp.net-mvc

每个视图或每个控制器操作一个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. 使用相同的ViewModel进行POST / GET操作。
  2. 使用ViewModel进行我的GET操作,使用我的域模型进行POST操作。
  3. 使用不同的ViewModel进行GET,使用不同的ViewModel进行POST。

4 个答案:

答案 0 :(得分:10)

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

如果将不同的视图模型用于GET和POST操作,那么这些类之间仍然存在某种关系:继承或组合。

答案 1 :(得分:3)

正确答案

<强>既不即可。没有银弹,不应该。

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

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

这实际上与@ DarinDimitrov相似,但有直接的结论。

答案 2 :(得分:1)

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

通过这种方式,您可以准确地自定义您接受的输入参数。

答案 3 :(得分:0)

我对基本形式采用这种方法:

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

GET模型继承了POST模型。

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

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