MVVM ViewModel与MVC ViewModel

时间:2009-12-21 10:42:41

标签: asp.net-mvc design-patterns mvvm viewmodel

ViewModel是MVVM(Model-View-ViewModel)和ASP.NET MVC的推荐实现中使用的术语。研究“ViewModel”可能会让人感到困惑,因为每个模式都使用相同的术语。

MVC ViewModel和MVVM ViewModel之间的主要区别是什么?例如,我认为MVVM ViewModel更加丰富,因为缺少Controller。这是真的吗?

3 个答案:

答案 0 :(得分:48)

一个相当具有挑战性的问题要简洁地回答,但我会尝试一下。 (请记住,这些问题的答案仍然是开发人员争论的主题。)

在MVC中,ViewModel提供了呈现视图所需的所有信息。它包含的数据是使用模型中定义的数据创建的。 View读取ViewModel并呈现输出。来自View的输入传递给Controller,Controller操纵Model,构造一个合适的ViewModel,并将其传递给View进行渲染。

在MVVM中,ViewModel提供与MVC相同的功能,但它也通过提供允许View操作Model的命令来替换部分MVC Controller。 WPF数据绑定根据ViewModel中的更改管理View的更新(这有效地取代了MVC控制器的剩余功能)。

答案 1 :(得分:8)

我玩UI设计模式Bingo已经有一段时间..但是让我对此进行了尝试..

MVVM只是MS提出的......因为它可以帮助您充分利用WPF。您将视图的状态和行为组合到一个易于测试的类(表示模型)中,然后使用数据绑定将数据导入任何视图。

这个link简要介绍了MVVM的演变。将此与福勒的“GUI Architectures”系列相结合,你应该在路上。

更新:不知道有什么叫MVC-VM。显然是ASP.NET MVC人群的心血结晶。外观和声音类似于MVVM(除了针对ASP.NET MVC调整);唯一的区别是它限制了VM和View之间存在1:1的映射。我已经猜到了1:N,但其他一切都匹配。

答案 2 :(得分:4)

我知道这是一个(方式)旧问题,但我已经指出它是使用" View Model"在MVC的背景下。我认为这是不正确的,并且可能导致对两种/或两种模式都不熟悉的人产生混淆。无论谁做到了 - stahp。这就是为什么(它甚至可以以迂回的方式回答原始问题)。

this question中可以看到发生这种情况的示例。用户正在尝试使用在ASP.NET MVC应用程序中实现INotifyPropertyChanged的视图模型,从而在架构失败和心碎中将桌面和无状态Web应用程序设计混合在一起。

简而言之,没有" View Model"在MVC模式中。 ,但是,它是功能等价物,而且是控制器。只是为了清楚这些部件及其内容,

MVVM(桌面应用程序):

  • 模型 - 包含要在视图和视图模型之间传递的数据的强类型对象
  • 查看 - 用户查看的用户界面以及用户与系统交互的用户界面
  • 查看模型 - 解释用户操作(例如,通过ICommand),执行它们,更新应用程序状态

MVC(网络应用程序):

  • 模型 - 包含要在视图和视图模型之间传递的数据的强类型*对象
  • 查看 - 结合了模型,代码和HTML来呈现网页的UI生成器
  • 控制器 - 接受用户请求,解释用户请求,更新应用程序状态并使用View将此状态转换为HTML网页

模型在两种模式中几乎相同。桌面模型可以实现更新事件通知,Web模型可以是动态的(即,不是强类型的),并且两者都可以包括或不包括验证方法或元数据。

桌面中的

视图是用户看到的内容。在Web中,它是一个生成器,为浏览器输出HTML以在客户端显示。它必须解释桌面上的用户交互,但是在客户端javascript,浏览器和发送回服务器的请求处理的Web上。

视图模型/控制器在功能上大致相同,但在实现方式和操作方式上有很大差异。 在视图模型中,用户与应用程序的交互通过ICommands,路由事件和其他方法传递给View Models(许多MVVM框架提供了将View模型连接到UI和其他部分的不同方法。应用)。 在控制器中,请求中包含Controller将结果返回给用户所需的所有信息(假设它是200 OK请求)。 Controller必须执行任何必要的工作来创建HTML生成器(View)创建响应所需的状态(aka Model)。在设计方面,Controller位于View和Model之上,知道并控制两者,而ViewModel位于View旁边,在它们之间传递Model(和其他信息)。

有些人真正感到困惑的是,你可以将客户端MVVM框架混合到你的MVC应用程序中。这些仅存在于用户浏览器中的javascript中,并且与您在服务器端遵循的任何特定模式无关。您可以运行在客户端使用MVVM的经典ASP网站。地狱,您可以运行在客户端使用MVVM的静态HTML页面。他们是分开的。

这些javascript MVVM框架通常遵循与上述桌面MVVM模式类似的模式,但调整为更符合HTML DOM和javascript的性质。例如,没有广泛的绑定系统编织到DOM中,并且javascript具有非常有限的类型系统,因此将模板与模型匹配与WPF中的非常不同。它们通常也与服务器断开连接,当它们需要交互时,更喜欢AJAX调用而不是将页面POST回Controller(AJAX调用通常由ASP.NET MVC中的WebAPI控制器处理)。

因此,总而言之,MVC中确实没有View Model。 Controller是粗略的等价物,但它在接收用户输入,解释它并将结果返回给用户方面有很大的不同。使用术语"查看模型"在MVC中引用任何东西只能导致混淆,因此应该避免。使用适当的术语来表示图案的正确部分。它可能看起来很迂腐,但它应该有助于保持清晰,并且不会让那些对这两种模式都不熟悉的人感到困惑。