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