ASP.NET MVC模型与ViewModel


92

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

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

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

一些澄清将不胜感激。

Answers:


71

本质上,Model和View Model都是具有属性的简单类。

这些类的主要目的是为相应的观众(分别是控制器和视图)描述一个对象(“模型”)。

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

据我了解,这是一种模型,其特定目的是与View进行交互

因此,虽然模型类实际上是与您的应用程序交互的域实体,但是视图模型是与视图交互的简单类。

希望能帮助到你 :)

更新

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


1
好的,谢谢,也感谢您的更新,这很有帮助!因此,如果不考虑MS的特殊版本(带有MVC 2),是否将ViewModels放置在特殊的指定文件夹中?或者,它们实际上只是像其他任何文件夹一样直接放入“模型”文件夹中。或者,你能做到吗?
Qcom 2010年

别客气。通常,我将模型和视图模型放在同一文件夹中,因为我想根据它们所引用的域将它们分组在一起,但这只是我的选择,而且我敢肯定会有更好的选择
Lorenzo 2010年

5
ViewModel应该将View与(域)Model分开。因此,将ViewModel放置在View附近而不是Model附近是有意义的。
Vitaliy Ulantikov 2011年

我会将我的“模型”类保留在我的MVC项目之外,而不是在Model文件夹中-但是,我会将View模型类保留在MVC项目中,以便正如Vitaliy所说的那样,它们将在View附近。
丹·哈里斯

@Lorenzo在第一行中,您说“两个带有属性的简单类”。我认为您的意思是物业?如果没有,您指的是哪些属性?属性属性
xr280xr

69

用最简单的术语来说,我想以下几点:

模型:严格的外观和感觉就像您的数据模型。出于所有目的和目的,它仅是数据模型的类表示。它不了解您的视图或视图中的任何元素。也就是说,它不应包含将用于View的任何属性装饰器(即,Required,Length等)。

视图模型:充当视图和模型之间的数据绑定器,在许多情况下,它也是模型的包装。如果没有View,它将变得无用,因此通常无法像标准Model一样在多个View和Controller之间重用。

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

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

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

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

2
您能否提供ViewModel的完整示例?它如何知道myModel是什么以及如何获取myModel的数据?
M Kenyon II

5
本质上,ViewModel是一个普通的C#对象(PO​​CO),永远不会真正知道您的数据模型是什么样的。它更多地是数据模型和视图需要显示的特定元素的混合体。至于如何获取数据,您必须将其加载到数据中。我喜欢使用一个单独的中介类,在其中调用数据服务,然后将数据手动加载到ViewModel中。然后,我将完全加载的ViewModel返回到控制器操作。
杰森·马塞尔2015年

26

我发现本文是了解MVC应用程序中“域模型”和“视图模型”如何交互(特别是在绑定方面)的非常有用的资源。最好的是包括示例而不是抽象描述。

“自从MVC发布以来,我已经观察到关于如何最好地构建视图模型的许多困惑。有时这种困惑并非没有充分的理由,因为似乎没有关于最佳实践建议的大量信息。此外,还没有一个“千篇一律”的解决方案充当了灵丹妙药,在这篇文章中,我将描述一些已经出现的主要模式以及每种模式的利弊,请务必注意,其中许多模式解决现实世界问题的人们已经出现了。”

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


19

WikiPedia对Model vs.ModelView的描述比在SO答案中提供的更为完整:http : //en.wikipedia.org/wiki/Model_View_ViewModel

我引用:

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

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

ViewModel:ViewModel是“视图的模型”,这意味着它是View的抽象,也用于View和Model之间的数据绑定。可以将其视为控制器的专用方面(在MVC模式中),它充当将数据模型信息转换为视图信息并将命令从视图传递到模型的数据绑定器/转换器。ViewModel公开公共属性,命令和抽象。ViewModel已被比喻为数据的概念状态,而不是Model中数据的实际状态。


3
虽然描述了Model和ViewModel,但该链接仅描述了MVVM体系结构模式。不是模型和视图模型之间的区别
Lorenzo

5

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

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

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


在我正在阅读的《 Professional ASP MVC 2》一书中,第1章介绍了ViewModel,作为保持强类型和DRY表示/模型交互的一种方法。微软的作者包括Scott Hansleman,Phil Haack和Scott Guthrie。
贝里

最近,我已经看到了很多东西,Asp.net MVC中使用了ViewModel。似乎ViewModel在视图中的业务要比Domain Model多。因此,我们一直在使用的模式是让域模型组装ViewModel的主要部分。当前,我们使用与域模型一起使用的修改后的命令模式(操作)来执行其任务。结果被组装到ViewModel中并发送到视图。在这种情况下,视图模型包含所有支持视图的注释和简单,集中的逻辑。
Sinaesthetic,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.