Model view controller 如何让控制器根据视图更改其行为?

Model view controller 如何让控制器根据视图更改其行为?,model-view-controller,language-agnostic,Model View Controller,Language Agnostic,如果用户从一个视图输入一些无效数据,例如: 电邮:bill@apple.com 然后我希望控制器: 不将数据放入模型中 将文本框涂成红色 不允许用户保存 但是,如果用户在不同的视图中输入相同的无效数据,我可能希望控制器: 将数据放入模型中 将文本框涂成红色 允许用户保存 但是,如果用户在不同的视图中输入相同的无效数据,我可能希望控制器: 将数据放入模型中 将文本框涂成蓝色 允许用户保存 另一种观点可能会: 将数据放入模型中 将文本框保持不着色 允许用户保存 另一种观点可能会:

如果用户从一个视图输入一些无效数据,例如:

电邮:bill@apple.com

然后我希望控制器:

  • 将数据放入模型中
  • 将文本框涂成红色
  • 不允许用户保存
但是,如果用户在不同的视图中输入相同的无效数据,我可能希望控制器:

  • 将数据放入模型中
  • 将文本框涂成红色
  • 允许用户保存
但是,如果用户在不同的视图中输入相同的无效数据,我可能希望控制器:

  • 将数据放入模型中
  • 将文本框涂成蓝色
  • 允许用户保存
另一种观点可能会:

  • 将数据放入模型中
  • 将文本框保持不着色
  • 允许用户保存
另一种观点可能会:

  • 自动更正数据,将其放入模型中
  • 将文本框涂成红色
  • 允许用户拥有
另一种观点可能是:

  • 自动更正数据,将其放入模型中
  • 使用新数据更新视图
  • 将文本框涂成蓝色
  • 允许用户保存
[无限期]

如果不对n视图使用n控制器,我该如何执行此操作


更新 我正要问一个关于stackoverflow的新问题,“如何让控制器根据视图改变其行为。”但后来我意识到我已经有了完全相同的问题标题

今天的例子是:

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

  • 除非数据来自另一个视图。在这种情况下,会自动修剪某些字段以符合数据库规则

  • 除非数据来自另一个视图。在这种情况下,要求数据库抛出其
    截断的
    异常


MVC有很多实际问题,我在我读过的书/文章/博客中从来没有提到过——难怪我不使用它。

每个视图必须执行的逻辑必须存在于某个地方。我建议您使用这些信息来增强视图,而不是使用多个控制器,或者创建某种映射Interween 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个属性(可能缺少一个或两个),控制器可以启动一系列操作,这些操作将唯一地处理每种类型的视图。视图必须向控制器公开其自身或属性。

您的示例可以在视图中进行一些概括,正如建议的那样,但是,有些用例确实要求不同的控制器imho。您也可以尝试在m中添加一些逻辑奥德尔斯。 颜色是直视的东西,控制器应该决定在模型中保存数据是否合理,如果数据没有某些属性决定是否应该保存,让它在控制器上,可能是不同的控制器。自动更正应该在视图和帮助器中。
这只是我的观点。

总结一下问题:

  • 似乎您需要N个不同的行为,而不需要N个控制器

  • 您不希望将视图控制器(无11关系)紧密耦合,但您希望控制器对每个视图的行为具有强大而多样的控制

  • 让我换一种说法说:

  • 似乎您想要N个不同的行为,而不需要N个对象

  • 您不希望将A对象B对象(无11关系)紧密耦合,但希望B对象对每个A对象的行为具有不同的严格控制

  • 以下是我对这两个问题的看法:

  • 这不是MVC的问题,这是一个经典的软件问题:您需要N个对象来拥有N个不同的行为,或者您需要参数化这些行为,以便您可以提取出通用性(例如Anurag建议的方法)来拥有少于N个单独的对象和/或求助于一个巨大的case语句。:-)

  • 这不是
    MVC
    的问题,而是它的一个权衡。
    MVC
    让我们将M、V和C代码解耦,以简化未来的更改(例如更改或添加视图)。但这种权衡不是免费的,组件之间的相互了解和控制必然较少。要么放弃对视图的严格控制(没有N种不同的行为),要么放弃C和V之间的隔离(例如,允许11个紧密耦合的视图控制器)

  • 当然,
    MVC
    在将Ms与Vs和Cs解耦方面取得了巨大的成功,但在将Vs和Cs彼此解耦方面取得了较小的成功。我认为今天的响应式接口需要耦合视图和控制器,或者从不同的角度开始,不值得付出巨大的努力和复杂性来强烈隔离视图和控制器