38

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

MVC ViewModel 和 MVVM ViewModel 之间的主要区别是什么?例如,鉴于缺少控制器,我认为 MVVM ViewModel 更丰富。这是真的?

4

3 回答 3

50

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

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

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

于 2009-12-21T11:35:13.373 回答
8

自从我玩 UI 设计模式宾果游戏已经有一段时间了.. 但是让我试一试..

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

链接简要介绍了 MVVM 的演变。将此与 Fowler 的“ GUI 体系​​结构”系列相结合,您就应该开始了。

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

于 2009-12-21T10:55:45.767 回答
5

我知道这是一个(方式)老问题,但我已经将其作为在 MVC 上下文中使用“视图模型”的示例。我认为这是不正确的,并且可能导致不熟悉其中一种/或/两种模式的人感到困惑。不管是谁在做——stahp。这就是原因(它甚至以迂回的方式回答了原始问题)。

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

简单地说,MVC 模式中没有“视图模型”。但是,有一个功能等价,那就是控制器。只是为了清楚零件及其用途,

MVVM(桌面应用程序):

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

MVC(网络应用程序):

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

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

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

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

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

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

因此,总而言之,MVC 中确实没有视图模型。控制器是粗略的等价物,但在接收用户输入、解释输入并将结果返回给用户的方式上却大不相同。使用术语“视图模型”来指代 MVC 中的任何内容只会导致混淆,因此应该避免。对模式的适当部分使用适当的术语。这可能看起来很迂腐,但它应该有助于让事情变得清晰,并且不会让对这两种模式不熟悉的人感到困惑。

于 2014-12-09T13:43:46.823 回答