ASP.net MVC -每个视图或每个动作一个视图模型

本文关键字:视图 模型 一个 net MVC ASP | 更新日期: 2023-09-27 18:08:34

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

ASP.net MVC -每个视图或每个动作一个视图模型

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

在GET和POST操作使用不同视图模型的情况下,这些类之间仍然存在一些关系:继承或组合。

正确答案

既不

。没有灵丹妙药,也不应该有。

因此,正确的答案是:使用尽可能多的视图模型,因为您的用户界面进程需要。这与视图或控制器动作无关。

有时一个操作需要一个视图,而另一个操作需要一个视图。但不要遵循一些严格的指导方针,这会阻碍你的发展。随着应用程序的开发,视图模型将自然而然地出现。而且应该。否则,您可能会以基于某些准则的不合理视图而告终,这些准则是您已经确定的。

这实际上是一个类似于@DarinDimitrov的回答,但有一个直接的结论。

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

对于基本表单,我遵循以下方法:

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

GET模型继承了POST模型

我经常将域对象传递给GET模型的构造函数,并用它做两件事:
  1. 用域对象的数据填充POST模型属性。
  2. 将域对象封装为GET模型中的局部变量。我用它来显示域对象中的一些(只读)数据。节省了一点精力。有些人会告诉你不要这样做。