Model-View-Controller:用户是否与View或Controller交互?[关闭]


14

我最近了解了MVC设计模式。我正在从《 Head First设计模式》一书中学习。

根据这本书(如果我理解正确的话):

该模型是大多数应用程序逻辑和数据。

View基本上是一个GUI,它向用户直观地表示模型。

控制器负责“调解”,并充当视图和模型之间的“中间人”。视图向控制器报告用户已执行操作,控制器将其转换为模型上的方法调用。

但是,网上很多地方都与我从那本书中了解的内容相矛盾。他们声称,一般而言,用户是与控制器(而不是视图)交互的。

哪一个是正确的或更常见的?用户是直接与Controller交互还是与View直接交互?两种方法都可以接受吗?哪个更常见?


4
这个问题对您编写方式的回答没有意义。给我们举一个与书中矛盾的地方的例子,我们将尝试对其进行解释。 具体说明您的示例。
罗伯特·哈维2014年

1
2个答案,都被支持,一个说“与视图交互”,另一个说“与控制器交互” ..让我觉得如果MVC在如此基本的层面上引起混淆,那它并不是一个很好的体系结构!
gbjbaanb 2014年


您单击应用程序的控件还是数据库查询?交互直接与用户界面进行交互,而用户界面本身就是一个视图。视图通常调用对服务器的请求(对于Web应用程序)或调用在服务器上注册的挂钩(对于客户端应用程序)。除了整个MVC只是胡扯。
luke1985 2014年

@spectre在没有提供解释的情况下关闭MVC是没有用的,理想情况下,它是一种替代方法。否则,解雇不会有任何帮助,应该将其排除在您的评论之外。此外,即使那样,它仍然是题外话。
underscore_d

Answers:


18

用户与视图进行交互,但是视图必须将动作传达给控制器。该控制器可以更新模型,但它不与每个/任何变化所需要的。

我提供的描述是基于我对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应用程序中,该视图仅显示信息。控制器处理并响应用户输入和交互。例如,控制器处理查询字符串值,并将这些值传递给模型,而后者又可以使用这些值来查询数据库。


如果您没有所有操作的GUI怎么办?如果您只为某些特定部分实现了API,该怎么办?这是否意味着用户有时与View交互,有时又与Controller直接交互?
Mahdi 2014年

1
在我看来,没有。API取代了视图。
亚当·祖克曼2014年

但API可能很简单url-routes,放在了Controller。我的意思是根本没有视野……
Mahdi 2014年

1
@AdamZuckerman感谢您的回答。在下一条评论中,我将描述我认为通用MVC实现的工作原理,请确认它是否正确。谢谢
Aviv Cohn 2014年

2
@Mahdi根据定义,API是作为编程接口而不是用户界面存在的。程序与API交互,用户与View交互。
埃里克·金

4

用户与控制器交互。从技术的角度来看,您不是在与View交互,而只是在使用它与Controller交互。

从表面上看,用户似乎正在与GUI交互-对于非程序员而言,这更有意义,但是,通过单击按钮,您基本上是在与Controller而不是View对话。

并非所有的应用程序-甚至MVC Web应用程序都具有GUI。您可以通过API 与Controller进行交互- url-routes例如,很简单,就放置在Controller本身中。

控制器应是地方接收手柄的用户请求。因此,如果您以某种方式直接从View访问模型 -无关紧要,则不再是MVC


2
+1这是正确的。菜单和工具栏之类的内容是GUI的一部分,而不是视图的一部分,直接进入控制器。击键也一样。
david.pfx 2014年

1
视图作为抽象存在的原因是,因此我们可以在必要时轻松替换它们。各种平台上的应用程序控制器可以相同,但视图必须以不同方式识别用户手势并将其转换为控制器操作。因此,我不同意用户直接与控制器进行交互。
Fuhrmanator 2014年

1
@Mahdi我想说的是,在这种情况下,根本没有用户交互,这是视图以编程方式与控制器进行通信。用户发起的唯一交互是通过视图。
埃里克·金

1
@ david.pfx击键不能直接从浏览器窗口转到控制器。
亚当·祖克曼

1
@Izkata“视图是请求发送到的代码的一部分” –抱歉,这是我在这里听到的最糟糕的事情。这怎么可能呢?您可以通过在文章或书中提供参考来支持它吗?
Mahdi 2014年

1

让我们用一个具体的示例说明为什么用户直接与视图而不是与控制器交互。

在iPhone上的音乐应用程序中,高级功能是播放播放列表。“播放播放列表”是应用程序控制器的功能。

有多种激活该功能的方法。我可以单击应用程序内的播放列表,也可以要求Siri(语音界面)执行相同的功能。这些是各种视图可以识别的两个不同手势

每个视图中的反馈也不同。Siri会告诉您它正在播放您请求的音乐。音乐应用会向您显示正在播放播放列表的视觉反馈。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.