model-view-controller - 如何让 Controller 根据 View 改变其行为?

标签 model-view-controller language-agnostic

如果从一个 View 中用户输入了一些无效数据,例如:

电子邮件:bill@apple.com

然后我希望 Controller :

  • 将数据放入模型
  • 将文本框着色红色
  • 允许用户保存

但如果用户在不同的 View 中输入相同的无效数据,我可能希望 Controller :

  • 数据放入模型
  • 将文本框涂成红色
  • 允许用户保存

但如果用户在不同的 View 中输入相同的无效数据,我可能希望 Controller :

  • 数据放入模型
  • 将文本框着色为蓝色
  • 允许用户保存

另一个 View 可能会:

  • 数据放入模型
  • 保留文本框未着色
  • 允许用户保存

另一个 View 可能会:

  • 自动更正数据,将其放入模型
  • 将文本框着色为红色
  • 允许用户拥有

另一个 View 可以:

  • 自动更正数据,将其放入模型
  • 用新数据更新 View
  • color 蓝色文本框
  • 允许用户保存

[无限]

如果不为 n-views 使用 n-controllers,我该怎么做?


更新

我正要问一个关于 stackoverflow 的新问题,“我如何让 Controller 根据 View 改变它的行为。”但后来我意识到我已经在使用完全相同的问题标题。

今天的例子:

  • 如果输入的数据对于它将进入的某些数据库表的某些部分来说太长,则执行验证并拒绝保存。

  • 除非数据来自另一个 View 。在这种情况下自动修剪某些字段以适应数据库规则

  • 除非数据来自另一个 View 。在这种情况下,要求数据库抛出它的 truncated 异常

在我读过的书籍/文章/博客中,我从来没有看到 MVC 的许多实际问题得到解决 - 难怪我不使用它。

最佳答案

每个 View 必须执行的操作的逻辑必须驻留在某个地方。我建议您使用该信息授权 View ,而不是使用多个 Controller ,或在单个 Controller 内的 View => 配置之间创建某种映射。

我不知道这些 View 在您的域中代表什么,但如果可以将无效数据保存到模型中,如果允许自动更正,无效的视觉指示,看起来 View 似乎是命令数据等。为什么不用所有这些信息来增强 View ?

这些 View 中的每一个都具有特定的属性。

acceptsInvalidData => boolean, place invalid data to model
requiresAutoCorrection => boolean, auto-correct the data
synchronizeWithModel => boolean, always keep the view in sync with the model
allowsSavingInvalidData => boolean, allow saving of invalid data
invalidDataIndicator => string:color, how to color view for invalid data

鉴于这 5 个属性(可能缺少一个或两个), Controller 可以启动一系列操作,这些操作将唯一地处理每种类型的 View 。 View 必须将自己或属性暴露给 Controller 。

关于model-view-controller - 如何让 Controller 根据 View 改变其行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2464824/

相关文章:

angularjs - Angular JS动态地将列添加到ui-grid

java - Java中根据模型- View - Controller 制作 View

algorithm - 什么是尾递归?

arrays - 列表理解的方法,以设定的间隔将不同的字符串连接到列表中。 (与语言无关)

language-agnostic - 开发人员如何学习网页设计?

language-agnostic - 面向切面编程发生了什么?

model-view-controller - Extjs 4 MVC 从 Controller 加载 View

java - 刷新页面时如何防止重复输入

c++ - 将遗留 C 代码重构为 MVC 设计

function - 良好的编码习惯 : When to Create New Functions