ViewModel和Controller有什么区别?

45

一个与另一个的职责是什么? 一个与另一个应该放什么样的逻辑? 哪一个会涉及服务和数据库? 如何决定我的代码应该放在ViewModel还是Controller中?

记录一下,我正在使用ASP MVC,但由于问题是架构性的,我认为使用何种语言或框架并不重要。我邀请所有MVC来回答。

7个回答

40
ViewModel是一种用于处理视图的表示逻辑和状态的模式,控制器是任何MVC框架的基本组成部分之一,它响应任何http请求并协调所有后续操作直到http响应。在ViewModel模式中,UI和任何UI逻辑都封装在一个视图中。视图观察一个ViewModel,该ViewModel封装了呈现逻辑和状态。ViewModel反过来与模型交互,并充当其与视图之间的中介。更多信息请参见此处
View <-> ViewModel <-> Model

控制器(来自前置控制器模式):了解更多

它“提供了一个集中的入口点来处理请求。”

HTTP Request -> Controller -> (Model,View)

--普通区别:--

  • 虽然ViewModel是一种可选的模式,但如果您选择MVC方式,则必须使用Controller。
  • ViewModel封装了演示逻辑和状态,而Controller则编排整个应用程序流程。

14

图片描述

  • ViewModel 可以在客户端和服务器端都存在。无论在哪里,ViewModel 的唯一目的是处理展示数据。
  • 在 MVC 架构中,ViewModel 不是必需的,但没有控制器,来自客户端的请求就不能被处理。
  • 控制器可以看作是客户端和服务器之间的主要接口,用于获取任何来自服务器的响应。它处理客户端请求,从仓库中获取数据,然后准备视图数据。ViewModel 可以被视为视图数据处理器/展示器,因此是一个更加优雅地管理视图的接口。
  • 在 Web 应用程序的整体上下文中,我们可以说控制器是应用程序请求处理程序,而 ViewModel 仅是 UI 处理程序。

1
我看到了这个问题,因为我想知道MVC和MVVM之间的区别是什么,但如果我没记错的话,根据你的图示,MVVM是MVC的一个子集。 - Ogier Schelvis
2
@OgierSchelvis,不,它们是不同的,你也可以有MVVMC(两者的混合)。 - Mohammed Noureldin

3
模型-视图-控制器(MVC)是一种设计模式,其主要目的是将业务逻辑与表现分离。基本上,您不希望后端接触前端。它通常看起来像这样:
原因是,通过将后端和前端分开,您不会直接将用户界面绑定到数据/工作上。这使您可以将新界面放在业务逻辑上而不影响该逻辑。此外,它还提高了测试的易用性。
MVC非常有用的一个简单示例-假设您有一个管理公司财务的应用程序。现在,如果您正确使用MVC,则可以拥有一个前端坐在某个金融家的桌子上,让他处理交易,管理财务等。但是,由于业务逻辑是独立的,因此您还可以为CEO的黑莓提供前端,以便他查看业务的当前状态。因为两个前端是不同的,所以它们可以做不同的事情,同时仍然提供对数据的(不同类型的)访问。
编辑:
既然您更新了问题,那么我也会更新我的答案。 MVC的分离没有完美的科学。然而,有一些好的经验规则。例如,如果您谈论GUI组件,那可能是一个视图。(您是否在谈论外观,可用性等)如果您谈论数据和“业务”方面(数据库,逻辑等),则可能是一个模型。而且,任何控制两者之间交互的内容很可能都是一个控制器。
此外,值得注意的是,虽然视图和模型通常是“物理上”分开的,但在有意义的情况下,控制器可以存在于视图中。
当您说MVC的框架(甚至语言)并不重要时,您是正确的。该模式本身与语言无关,实际上描述了一种构建系统的方法。
希望对你有所帮助!

我喜欢“语言无关”的说法。 - Thomas Matthews
1
感谢,能否详细解释一下视图模型(View Model)和控制器(Controller)之间的区别? - MedicineMan

2

我认为学习已有的教条是有价值的,但了解教条形成的过程也很有价值。

Trygve Reenskaug被广泛认为是MVC的发明者。N. Alex Rupp的文章《超越MVC:Servlet架构的新视角》中包含了MVC的历史。在Reenskaug于1978年在施乐帕洛阿尔托研究中心的工作部分中,有一个链接指向他的论文《Thing-Model-View-Editor: an Example from a planningsystem》。其中这些部分被描述如下:

Thing

对用户感兴趣的东西。它可以是具体的,比如房子或集成电路。它可以是抽象的,比如新想法或对一篇论文的看法。它可以是整体,比如计算机,也可以是部分,比如电路元件。

Model

模型是计算系统中以数据形式呈现抽象的主动表示

View

对于任何给定的模型,都会附加一个或多个视图,每个视图能够在屏幕和硬拷贝上显示一个或多个模型的图形表示。视图还能够执行与该视图合理相关的模型操作。

Editor

编辑器是用户和一个或多个视图之间的接口。它为用户提供适当的命令系统,例如菜单,可以根据当前上下文动态更改。它为视图提供必要的协调和命令消息。

Rupp将Reenskaug的Editor标识为ControllerTool

MVC三元组出现在SmallTalk-80中。模型是现实世界概念的抽象,视图是其可视化表示,控制器是允许用户与之交互(从而“控制”视图)的按钮和滑块。三元组中的所有部分都相互连接,并且可以与另外两个部分通信,因此不存在分层或抽象。自那时以来,Reenskaug“更喜欢使用工具这个术语而不是控制器”。根据他的笔记,这些是他在后来的实现中使用的术语。


1

需要调用一些逻辑和模型来生成一些数据(结构化或半结构化)。根据这些数据,通常只使用简单的大纲逻辑来创建返回的页面/JSON等。

第一部分(创建数据)由控制器完成(通常通过模型实现)。第二部分由视图完成。ViewModel是在控制器和视图之间传递的数据结构,通常只包含访问器。


0

模型代表您的数据以及它如何被操作。因此,模型会涉及到数据库。

视图是您的用户界面。

控制器是它们之间的粘合剂。


-3

MVC代表模型(Model),视图(View)和控制器(Controller)。

模型=数据(数据库表)

视图= HTML,CSS,JavaScript等

控制器=主逻辑,是模型和视图之间的契约。

简单易懂地说,MVC允许您以一种方式开发应用程序,使您的业务数据和演示数据分离。有了这个,开发人员和设计师可以独立地在MVC应用程序上工作,而不会相互冲突。 MVC还使您的应用程序可用于面向对象编程。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接