用户与视图进行交互,但是视图必须将动作传达给控制器。该控制器可以更新模型,但它不与每个/任何变化所需要的。
我提供的描述是基于我对MVC的.NET实现的个人经验。您的实现可以不同。
该控制器是其中的行动进行处理,基本上是一个业务层。一个简单的控制器除了从模型中获取数据以馈送到视图外,无能为力。复杂的Controller将执行各种操作,直至安全管理,身份验证,授权,注册以及可能的许多其他事情。
该视图应该只负责显示的方式,用户可以理解的信息。控制器和模型之间可能会有一些交叉,因为诸如单页应用程序(SPA)之类的东西将为用户提供数据验证反馈。其他任何跨界车都皱着眉头。
该模型处理数据。这包括数据验证(如果适用)。数据存储和检索也在此层中进行。
更新
谁在何时执行操作似乎有些混乱。我包括了MVC体系结构的两个不同的概述,因为它们是相似的,但不相同。两种解释都有余地。可能还有更多。上面的描述是我对MVC的多种解释,包括我自己使用该方法构建应用程序的经验。希望此更新将有助于消除这种混淆。
MVC试图为软件开发建立关注点分离设计模式。据我所知,它主要是在基于Web的应用程序中实现的。
该视图处理所有的用户交互。如果您的用户单击按钮,则视图将确定该单击是用户界面交互还是超出其关注范围(控制器交互)。如果该按钮执行的操作类似于将值从一个字段复制到另一个字段,则您的实现将确定这是View方面还是Controller方面。在处理单页应用程序(SPA)时,您最有可能只会出现这种模糊的顾虑。
该控制器是你的行为进行处理。视图已通知用户决定更改某些字段的值。控制器可以对该数据执行验证,也可以由模型处理。同样,这取决于实现。如果Controller具有安全功能,则可能会确定用户没有足够的特权来执行操作。它将拒绝更改并相应地更新视图。控制器还确定要从模型检索哪些数据,如何打包数据以及使用该数据更新视图。
该模型确定如何以及在何处存储数据。它还可以在存储数据之前执行对该数据的验证(之所以这样做,是因为人们有时会绕过View)。
维基百科上有一篇关于MVC的文章。
- 甲模型通知其关联的视图/视图和控制器,当出现了在其状态的变化。此通知允许视图更新其表示,并允许控制器更改可用的命令集。在某些情况下,MVC实现可能是“被动的”,因此其他组件必须轮询模型以获取更新,而不是被通知。
- 甲视图由控制器所有需要用于产生输出表示给用户的信息告知。它还可以提供通用机制来通知控制器用户输入。
- 一个控制器可以发送命令到模型更新模型的状态(例如,编辑文档)。它还可以将命令发送到其关联的视图,以更改模型的视图表示(例如,通过滚动文档)。
摘自Microsoft的MVC概述。
楷模。模型对象是应用程序的一部分,用于实现应用程序数据域的逻辑。通常,模型对象检索模型状态并将其存储在数据库中。例如,一个Product对象可能会从数据库中检索信息,对其进行操作,然后将更新后的信息写回到SQL Server数据库中的Products表中。
在小型应用程序中,模型通常是概念上的分离,而不是物理上的分离。例如,如果应用程序仅读取数据集并将其发送到视图,则该应用程序没有物理模型层和关联的类。在这种情况下,数据集将充当模型对象的角色。
意见。视图是显示应用程序的用户界面(UI)的组件。通常,此UI是根据模型数据创建的。一个示例是“产品”表的编辑视图,该视图根据“产品”对象的当前状态显示文本框,下拉列表和复选框。
控制器。控制器是处理用户交互,使用模型并最终选择一个视图以呈现显示UI的组件。在MVC应用程序中,该视图仅显示信息。控制器处理并响应用户输入和交互。例如,控制器处理查询字符串值,并将这些值传递给模型,而后者又可以使用这些值来查询数据库。