ASP.NET MVC模型与ViewModel

时间:2010-10-31 01:21:55

标签: asp.net-mvc asp.net-mvc-2 model viewmodel

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

现在,这是一种特定的模型,对吗?不是特定的视图。

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

一些澄清将不胜感激。

5 个答案:

答案 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进行双向绑定,因此技术有点不同。例如,如果将文本框绑定到字段,则在键入该文本框时,字段的值将动态更新。由于网页是无状态的,因此在网页中实际上不可能进行这种交互。

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