2010-10-31 101 views
69

好的,我一直听到关于MS的ASP.NET MVC的“ViewModels”的讨论。ASP.NET MVC模型vs ViewModel

现在,这是打算成为一种特定类型的模型,是否正确?不是特定类型的视图。

据我了解,这是一种模型,具有与视图交互的特定目的?或类似的东西?

一些澄清将不胜感激。

回答

54

基本上模型和视图模型都是具有属性的简单类。

这些类的主要目标是为它们各自的受众(分别为控制器和视图)描述(以“模型”)对象。

所以你时,你说

我的理解是完全正确的,它是一种 模型具有的 特定目的与景观互动

所以,当模型类实际上是您的应用程序与之交互的域实体,View Models是您的视图与之交互的简单类。

希望它能帮助:)

更新

微软已经通过马丁公司研制呈现图案的专用版本福勒主要是基于模型 - 视图 - 控制器,并把它称为模型 - 视图 - 用于PF应用程序的ViewModel(MVVM)。该模式针对的是现代UI开发平台,其中UI开发人员比传统开发人员具有更多基于业务逻辑的不同需求。有一点理论的外观here

+1

好的,谢谢,也感谢您的更新,这非常有帮助!因此,如果没有考虑到MS的特殊版本,以及MVC 2的股票,你是否将ViewModels放置在一个特殊的指定文件夹中?或者它们本质上就像其他任何一个一样直接进入Models文件夹。或者,你可以做吗? – Qcom 2010-10-31 01:47:45

+0

不客气。通常我会将模型和视图模型放置在同一个文件夹中,因为我想将它们组合在一起以尊重它们引用的域,但这只是我的选择,我相信还有更好的方法 – Lorenzo 2010-10-31 01:51:20

+5

ViewModel应该将View和(Domain)Model分开。所以将ViewModel放在View附近而不是Model附近是有意义的。 – 2011-08-29 14:28:24

16

维基百科模型与模型视图更为完整的描述比你在得到如此回答:http://en.wikipedia.org/wiki/Model_View_ViewModel

我引述:

型号:如在经典的MVC模式中那样,模型是指(a)代表真实状态内容的对象模型(面向对象的方法),或者(b)代表内容的数据访问层(以数据为中心的方法)。

查看:与传统的MVC模式一样,视图引用GUI显示的所有元素,例如按钮,窗口,图形和其他控件。

视图模型:视图模型是一个“视图的模型”,这意味着它是一个也用作在数据中的视图和模型之间的结合视图的抽象。它可以被看作是一个控制器(在MVC模式中)的一个特殊方面,它充当一个数据绑定器/转换器,将模型信息更改为视图信息并将视图中的命令传递到模型中。 ViewModel公开了属性,命令和抽象。 ViewModel已经被比作数据的概念状态,而不是模型中数据的实际状态。

+3

虽然有关于Model和ViewModel的描述,但该链接仅描述了MVVM架构模式。不是模型和视图模型之间的区别 – Lorenzo 2010-10-31 01:52:35

+1

我比被接受的答案有更好的描述差异:) – 2010-10-31 03:33:00

+0

我同意 - 这和Jason Marsell的答案都能更好地捕捉到“vs.”这个问题的一部分。 – 2015-04-01 17:54:58

5

有一个ViewModel的概念,但它通常不与Asp.net MVC关联。 MVC使用模型视图控制器模式,控制器处理交互,根据模型构建数据,然后将该数据传递给视图进行显示。

ViewModels(和Model View ViewModel模式)通常与Silverlight和WPF相关联。 Xaml有点不同,因为视图可以对ViewModels进行双向绑定,所以技术有点不同。例如,如果您将文本框绑定到字段,那么在您键入该文本框时,该字段的值会动态更新。由于网页是无状态的,因此这种交互在网页中是不可能的。

两种模式的相似之处在于它们都试图将逻辑从显示中分离出来。最常见的用途/原因是测试:您希望能够通过代码(通过测试框架)执行用户通过用户界面调用的所有交互。

+0

+1用于描述我忘记提及的两种模式之间的相似性 – Lorenzo 2010-10-31 01:56:49

+0

在第1章介绍的“Professional ASP MVC 2”中,我介绍ViewModel作为保持表示/模型交互的强类型和DRY 。微软作者包括Scott Hansleman,Phil Haack,Scott Guthrie。 – Berryl 2010-10-31 03:33:07

+0

最近我见过很多,ViewModel被用在Asp.net MVC中。看起来ViewModel在视图中比在Domain Model中有更多的业务。所以我们一直使用的模式是让域模型组装ViewModel的主要部分。目前,我们使用修改的命令模式(操作)与域模型一起执行其任务。结果汇编到ViewModel中并发送到视图。在这种情况下,视图模型包含所有支持该视图的注释和简单而有针对性的逻辑。 – Sinaesthetic 2013-07-31 06:32:16

24

我发现这篇文章是一个非常有用的资源,用于理解“域模型”和“视图模型”如何在MVC应用程序内进行交互,特别是在绑定方面。最重要的是包括例子而不是抽象的描述。

“自MVC发布以来,我观察到关于如何最好地构建视图模型的困惑很多,有时候这种混淆不是没有理由,因为似乎没有大量关于最佳实践建议的信息。此外,还没有一个“万能的解决方案”作为银弹,在这篇文章中,我将介绍一些已经出现的主要模式以及每种模式的优缺点,重要的是要注意许多这些模式已经从解决现实世界问题的人身上涌现出来。“

http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx

+1

非常好的链接文章。我发现的教程没有解决这个问题,这正是我正在寻找 – Tasio 2012-05-01 07:54:03

+0

@misteraidan - 伟大的文章,非常丰富,感谢分享。 +1 :) – Bibhu 2012-11-14 07:47:55

+1

优秀的文章。 – 2013-03-21 12:22:10

49

简单的说,我喜欢把以下内容:

型号:严格的外观和感觉就像你的数据模型。对于所有意图和目的,它只是数据模型的类表示。它不了解您的视图或视图中的任何元素。也就是说,它不应该包含任何将用于View的属性装饰器(即;必需的,长度等)。

查看模型:作为您的视图和您的模型之间的数据绑定器,在很多情况下,也是您的模型的包装。如果没有View,它将变得没有用处,所以它通常不能在多个视图和控制器(如标准Model)中重用。

举个例子,你的模型可能具有以下特性,这是您的数据源的直接表示:现在

public string FirstName { get; set; } 
    public string LastName { get; set; } 

,因为您的视图模型绑定到你的视图,它可能具有以下属性 - 它将Model的FirstName字段和LastName字段连接在一起作为一个字符串:

[Display(Name = "Customer Name")]     
    public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }} 
+1

你能提供一个更完整的ViewModel的例子吗?它如何知道myModel是什么以及它如何获取myModel的数据? – 2015-07-15 13:41:04

+3

本质上,ViewModel是一个普通的C#对象(PO​​CO),永远不会真正知道您的数据模型是什么样子。它更像是您的数据模型和视图需要显示的特定元素的混合体。至于它如何获得数据,你必须加载数据。我喜欢使用单独的中介类,在那里我将数据调用到服务中,然后手动将该数据加载到ViewModel中。然后,我将完全加载的ViewModel返回到控制器操作。 – 2015-07-15 16:42:28

+2

真棒解释!谢谢你,先生! – Unbreakable 2016-10-26 04:39:52