Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP.net MVC-每个视图或每个操作一个视图模型?_C#_.net_Asp.net Mvc - Fatal编程技术网

C# ASP.net MVC-每个视图或每个操作一个视图模型?

C# ASP.net MVC-每个视图或每个操作一个视图模型?,c#,.net,asp.net-mvc,C#,.net,Asp.net Mvc,每个视图使用一个ViewModel还是每个控制器操作使用一个ViewModel更好 例如: public ProjectController : Controller { public ActionResult Edit(int id) { var project = ...; return View(new ProjectEditViewModel(project)); } [HttpPost] public Acti

每个视图使用一个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)
    {
    }
}
以下是三个选项,哪一个是最好的

  • 对我的发布/获取操作使用相同的ViewModel
  • 将ViewModel用于“获取”操作,将域模型用于“发布”操作
  • GET使用不同的ViewModel,POST使用不同的ViewModel

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


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

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

    这样,您可以自定义您接受的输入参数。

    正确答案 两者都不。没有银弹,也不应该有

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

    有时,一个动作需要一个视图,另一个动作需要一个视图。但不要遵循一些会阻碍你发展的严格准则。在开发应用程序时,视图模型会自然而然地出现。而且应该。否则,你最终可能会得出一些不合理的观点,这些观点是建立在你已经确定的指导原则之上的


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

    对于基本形式,我遵循以下方法:

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

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

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

  • 一般来说,使用域模型本身作为发布到控制器操作的对象是一个坏主意吗?在我的示例中,如果我的项目类是一个实体框架类,那么将其用作我的后期控制器操作的参数是否是一个坏主意?@Dismissile,非常坏的主意。在任何情况下,切勿将任何域模型用作任何控制器操作的输入/输出。虽然对于这里讨论的视图模型的两种方法可能有不同的观点,但领域模型甚至不应该被考虑。您应该始终定义视图模型,就像您所说的不要将域模型用作任何控制器操作的输入/输出。如果我创建了一个用于编辑项目的ViewModel,并将其命名为ProjectEditViewModel,那么该ViewModel是否会将对项目的引用作为其属性之一,或者您是否会创建一个包含所有需要显示的字段的ViewModel,然后使用某种映射来获取从项目到ViewModel的字段?@Dismissible,我不会引用任何域模型作为视图模型的属性。我会在这个特定的视图中包含并重复我需要的属性。@DarinDimitrov:AD您的“您应该始终定义视图模型,始终”我宁愿定义这个:始终使用非DAO类进行用户交互。它们可能是视图模型实体、应用程序模型实体或服务器上转换为数据模型实体的任何其他实体。我通常有一个
    App.Objects
    程序集,其中包含层间通信的POCO,这些POCO在整个应用程序中使用,并由存储库来回转换为数据模型实体。当一个视图需要一个严格的Asp.net MVC特定的视图模型时,该类就不是同一个程序集的一部分了。在这里,与其他答案/注释一起,我总是为每个视图提供一个模型(或一对get/post模型)。