ViewModel是一个在MVVM (模型-视图-视图模型)中使用的术语,也是ASP.NET的推荐实现。考虑到每个模式都使用相同的术语,研究"ViewModel“可能会令人困惑。
MVC ViewModel和MVVM ViewModel之间的主要区别是什么?例如,考虑到缺少控制器,我认为会更丰富。这是真的吗?
发布于 2009-12-21 19:35:13
这是一个很有挑战性的问题,要简明扼要地回答,但我会尝试一下。(请记住,这类问题的答案仍然是开发人员之间争论的主题。)
在MVC中,ViewModel提供了呈现视图所需的所有信息。它包含的数据是使用Model中定义的数据创建的。视图读取ViewModel并呈现输出。来自视图的输入被传递给控制器,控制器操纵模型,构造适当的ViewModel,并将其传递给视图以进行呈现。
在MVVM中,ViewModel的功能与它在MVC中的功能相同,但它也通过提供允许视图操作模型的命令来取代MVC控制器的一部分。WPF数据绑定根据ViewModel中的更改管理视图的更新(这有效地取代了MVC Controller的剩余功能)。
发布于 2009-12-21 18:55:46
我已经有一段时间没有玩过UI设计模式了。然而,让我来试一试..
MVVM就是微软想出来的东西...因为它可以帮助您最大限度地利用WPF。您将视图的状态和行为组合到一个易于测试的类(表示模型)中,然后使用数据绑定将数据绑定到任何视图中。
这篇link简要介绍了移动虚拟机的发展过程。把这个和福勒的"GUI Architectures“系列结合起来,你就应该上路了。
更新:我不知道有一个叫MVC-VM的东西。显然是ASP.NET MVC人群的创意。外观和听起来都类似于MVVM (除了针对View进行了调整);唯一的区别是它限制了VM和ASP.NET之间存在1:1的映射。我猜是1:N,但其他都匹配。
发布于 2014-12-09 21:43:47
我知道这是一个老生常谈的问题,但有人指出它是在MVC上下文中使用“视图模型”的一个例子。我认为这是不正确的,可能会导致对这两种模式中的任何一种或两种模式都不熟悉的人感到困惑。不管是谁干的斯塔普。原因如下(它甚至是对原始问题的间接回答)。
发生这种情况的示例可以在this question中看到。用户试图使用在ASP.NET MVC应用程序中实现INotifyPropertyChanged的视图模型,从而在架构失败和令人心碎的情况下将桌面和无状态web应用程序设计混合在一起。
简单地说,MVC模式中没有“视图模型”。然而,还有一个功能上的等价物,那就是控制器。只是想弄清楚这些部件和它们的用途,
MVVM (桌面应用程序):
MVC (web应用程序):
在这两种模式中,模型实际上是相同的。桌面模型可以实现更新事件通知,web模型可以是动态的(即,不是强类型的),并且两者都可以包括或可以不包括验证方法或元数据。
在桌面上查看是用户所看到的。在web中,它是一个生成器,输出HTML供浏览器在客户端显示。它必须在桌面上解释用户交互,但在web上由客户端javascript、浏览器和发送回服务器的请求处理。
视图模型/控制器在功能上大致相同,但在实现方式和操作方式上有很大不同。在视图模型中,用户与应用程序的交互通过ICommands、路由事件和其他方法转移到视图模型(许多MVVM框架提供了不同的方法来将视图模型连接到UI和应用程序的其他部分)。在控制器中,请求包含控制器向用户返回结果所需的所有信息(假设是200OK请求)。控制器必须执行创建HTML生成器(视图)创建响应所需的状态(也称为模型)所需的所有工作。在设计上,控制器位于视图和模型之上,知道并控制两者,而ViewModel位于视图旁边,在它们之间传递模型(和其他信息)。
真正让一些人感到困惑的是,有一些客户端MVVM框架可以混合到MVC应用程序中。这些只存在于用户浏览器中的javascript中,与您在服务器端遵循的任何特定模式无关。您可以在客户端运行使用MVVM的经典ASP网站。见鬼,你可以在客户端运行使用MVVM的静态HTML页面。它们是那么的不同。
这些javascript MVVM框架通常遵循与上述桌面MVVM模式类似的模式,但经过调整以更符合HTML DOM和javascript的性质。例如,没有广泛的绑定系统编织到DOM中,而javascript的类型系统非常有限,因此将模板与模型进行匹配与在WPF中有很大不同。它们通常在与服务器断开连接的情况下工作,并且当它们需要交互时,更喜欢AJAX调用,而不是将页面返回给控制器(AJAX调用通常由ASP.NET MVC中的WebAPI控制器处理)。
因此,总而言之,MVC中确实没有视图模型。Controller大致相当,但在接收用户输入、解释用户输入和向用户返回结果方面有很大的不同。使用术语“视图模型”来指代MVC中的任何东西只会导致混淆,因此应该避免。对模式的适当部分使用适当的术语。它可能看起来很学究,但它应该有助于让事情变得清晰,并减少对这两种模式的新手的困惑。
https://stackoverflow.com/questions/1939403
复制相似问题