【发布时间】:2011-05-02 23:09:12
【问题描述】:
好的,我一直在听关于 MS 的 ASP.NET MVC 的“ViewModels”的讨论。
现在,这是一种特定的模型,对吗?不是特定类型的视图。
据我了解,它是一种具有与视图交互的特定目的的模型?或者类似的东西?
我们将不胜感激。
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-2 model viewmodel
好的,我一直在听关于 MS 的 ASP.NET MVC 的“ViewModels”的讨论。
现在,这是一种特定的模型,对吗?不是特定类型的视图。
据我了解,它是一种具有与视图交互的特定目的的模型?或者类似的东西?
我们将不胜感激。
【问题讨论】:
标签: asp.net-mvc asp.net-mvc-2 model viewmodel
WikiPedia 对 Model 与 ModelView 的描述比您在 SO 答案中得到的更完整:http://en.wikipedia.org/wiki/Model_View_ViewModel
我引用:
模型:在经典 MVC 模式中,模型指的是 (a) 表示真实状态内容的对象模型(面向对象的方法),或 (b) 数据表示该内容的访问层(以数据为中心的方法)。
视图:与经典的 MVC 模式一样,视图指的是 GUI 显示的所有元素,例如按钮、窗口、图形和其他控件。
ViewModel:ViewModel 是“View 的模型”,这意味着它是 View 的抽象,也用于 View 和 Model 之间的数据绑定。它可以被看作是控制器(在 MVC 模式中)的一个特殊方面,它充当数据绑定器/转换器,将模型信息更改为视图信息并将命令从视图传递到模型。 ViewModel 公开了公共属性、命令和抽象。 ViewModel 被比作数据的概念状态,而不是模型中数据的真实状态。
【讨论】:
用最简单的术语来说,我喜欢考虑以下几点:
模型:在外观和感觉上都像您的数据模型。出于所有意图和目的,它只是数据模型的类表示。它不知道您的视图或视图中的任何元素。也就是说,它不应包含您将用于视图的任何属性装饰器(即:必需、长度等)。
视图模型:充当视图和模型之间的数据绑定器,在许多情况下,它也是模型的包装器。如果没有 View,它将变得无用,因此它通常不能像标准模型那样跨多个 View 和 Controller 重用。
例如,您的模型可能具有以下属性,这些属性是您的数据源的直接表示:
public string FirstName { get; set; }
public string LastName { get; set; }
现在,由于您的 View Model 与您的 View 绑定,它可能具有以下属性 - 将 Model 的 FirstName 字段和 LastName 字段连接在一起作为一个字符串:
[Display(Name = "Customer Name")]
public string CustomerFullName { get { return String.Format("{0} {1}", myModel.FirstName, myModel.LastName) }}
【讨论】:
我发现这篇文章是了解“域模型”和“视图模型”如何在 MVC 应用程序中交互的非常有用的资源,尤其是在绑定方面。最重要的是包括示例而不是抽象描述。
“自从 MVC 发布以来,我发现很多关于如何最好地构建视图模型的困惑。有时这种困惑并非没有充分的理由,因为似乎没有大量关于最佳实践建议的信息. 此外,没有“一刀切”的解决方案可以作为灵丹妙药。在这篇文章中,我将描述一些已经出现的主要模式以及每种模式的优缺点。重要的是请注意,其中许多模式都是从人们解决现实世界问题中出现的。”
http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx
【讨论】:
有一个 ViewModel 的概念,但它通常不与 Asp.net MVC 相关联。 MVC 使用模型视图控制器模式,其中控制器处理交互,从模型构建数据,然后将该数据传递给视图进行显示。
ViewModels(和 Model View ViewModel 模式)更普遍地与 Silverlight 和 WPF 相关联。 Xaml 有点不同,因为视图可以双向绑定到 ViewModel,所以技术有点不同。例如,如果您将一个文本框绑定到一个字段,当您在该文本框中键入时,该字段的值会动态更新。由于网页是无状态的,因此这种交互在网页中实际上是不可能的。
这两种模式的相似之处在于它们都试图将逻辑与显示分开。最常见的用途/原因是测试:您希望能够从代码(通过测试框架)执行用户将通过用户界面调用的所有交互。
【讨论】:
本质上 Model 和 View Model 都是具有属性的简单类。
这些类的主要目标是为它们各自的受众(分别是控制器和视图)描述(“模型”)一个对象。
所以你说的完全正确
据我了解,这是一种 具有特定目的的模型 与视图交互
因此,虽然模型类是您的应用程序与之交互的有效领域实体,但视图模型是您的视图与之交互的简单类。
希望对你有帮助:)
更新:
Microsoft 开发了 Martin fowler 的 Presentation Pattern 的专门版本,主要基于 Model-View-Controller,并将其称为 PF 应用程序的 Model-View-ViewModel (MVVM)。此模式针对现代 UI 开发平台,在这些平台上,与传统开发人员相比,UI 开发人员更多地基于业务逻辑有不同的需求。看看here 了解一些理论
【讨论】: