ASP.NET MVC模型vs ViewModel

好的,我一直在听MS关于ASP.NET MVC的“ViewModels”的讨论。

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

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

一些澄清将不胜感激。

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

这些类的主要目标是描述(“模型化”)一个对象,它们分别是控制器和视图。

所以当你说的时候你是完全正确的

就我的理解,这是一种具有与View交互的特定目的的Model

所以,虽然Model类实际上是与应用程序交互的Domain Entities,但View Models是视图交互的简单类。

希望它有助于:)

更新

微软已经开发了一个由Martin fowler主要基于Model-View-Controller的Presentation Pattern的专用版本,并将其称为Model-View-ViewModel(MVVM),用于PF应用程序。 这种模式是针对现代UI开发平台的,UI开发人员比传统开发人员有更多的基于业务逻辑的不同需求。 看看这里有一些理论

用最简单的话来说,我喜欢想到以下几点:

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

查看模型:用作视图和模型之间的数据绑定,在很多情况下,也是模型的包装。 在没有View的情况下它将变得没有用处,所以它通常不能像多个标准Model一样在多个Views和Controllers中重用。

作为示例,您的模型可能具有以下属性,它们是数据源的直接表示forms:

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

现在,由于您的视图模型绑定到您的视图,它可能有以下属性 – 它将模型的名字字段和姓氏字段连接在一起作为一个string:

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

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

“自从MVC发布以来,我对如何最好地构build视图模型已经观察到了很多困惑,有时候这种混淆并不是没有理由,因为在最佳实践build议中似乎没有大量的信息,另外,一个“一刀切”的解决scheme,作为银弹,在这篇文章中,我将介绍一些已经出现的主要模式和每个模式的优缺点,重要的是要注意到这些模式中的很多已经从解决现实问题的人中脱颖而出。“

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

维基百科有一个更完整的模型和模型的描述比你会得到一个SO回答: http : //en.wikipedia.org/wiki/Model_View_ViewModel

我引用:

模型 :与传统的MVC模式一样,模型是指(a)代表真实状态内容的对象模型(面向对象的方法),或者(b)代表内容的数据访问层(数据 -中心的方法)。

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

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

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

ViewModels(和Model View ViewModel模式)更一般地与Silverlight和WPF相关联。 Xaml有点不同,因为视图可以双向绑定到ViewModels,所以技术有点不同。 例如,如果将某个文本框绑定到某个字段,则当您在该文本框中键入内容时,该字段的值将被dynamic更新。 由于网页是无状态的,因此这种交互在网页中是不可能的。

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