传统的MVC设计模式

Posted

技术标签:

【中文标题】传统的MVC设计模式【英文标题】:Traditional MVC design pattern 【发布时间】:2022-01-02 20:40:33 【问题描述】:

我有几个关于模型-视图-控制器架构的问题。我对在 Internet 上找到的有关 MVC 模式的所有相互矛盾的信息和不同的图表感到有些困惑。

    下图是否正确表示了层之间的 MVC 流?如果是这样,是否允许视图直接更新模型而不是通过控制器?

    被动模型和主动模型有什么区别?这些变化如何影响模型更改传播到控制器和视图?

    在模型更新后新数据如何同时获取到视图和控制器(在模型更新中有和没有控制器干扰)

3a。 (活动模型 - 观察者、通知)每次模型更新并从模型获取新数据时,视图和控制器都会得到通知吗?

3b。 (被动模型 - 无通知)控制器在委托模型更新并通知视图模型更改后是否接收更新的模型状态

如果能在理解 MVC 方面提供任何帮助,我将不胜感激。

【问题讨论】:

【参考方案1】:

约束通常由您使用的实现来设置。例如,考虑到 Web,Symfony 对 MVC 有其他想法,而不是 ASP.NET。

在网络环境中,没有人“通知”任何人,这一切都是无状态的,并且基于 HTTP 请求和响应。控制器可以接收模型作为 POST 正文或从 GET 参数绑定它,根据 ID 查找实体。

通常,HTTP 请求会触发控制器执行方法,该方法以 return View($model) 之类的形式结束。这个View() 方法会将模型渲染到模板,将生成的 html 返回给浏览器。我不会称之为通知或更新模型。

当“视图”(此时在用户浏览器中呈现为 HTML)包含表单时,它可以将用户修改的模型 POST 回控制器。这算作操纵模型的视图吗?该模型在浏览器中不存在。只有一个表格。控制器根据请求数据和可能的数据库数据重建模型。这个模型是被动的,只是一个带有保存数据属性的哑数据传输对象。

在桌面应用程序或其他有状态的应用程序 ("clientside MVC") 中,事物确实通过观察者、侦听器和诸如此类的方式相互通知更新。模型有一个“实例”,它存在于客户端应用程序中。这可以被认为是一个活跃的模型。

【讨论】:

“控制器可以接收模型作为 POST 主体或从 GET 参数中绑定它,或者根据 ID 查找实体” By model 你的意思是用户输入吗? “我不会称之为通知或更新模型” 如果用户的 HTTP 请求以某种方式更改模型怎么办? Controller 是否需要等到 Model 完成更新(例如执行 DB 更新任务)之后,才能将更新后的 Model 渲染到新的 View 上?

以上是关于传统的MVC设计模式的主要内容,如果未能解决你的问题,请参考以下文章

前端MVC变形记

ASP .NET MVC 架构如何适应传统的多层架构

前端开发 | 前端MVC变形记

前端MVC变形记

WEB前端MVC架构变形记

从MVC框架看MVC架构的设计