【问题标题】:How to have the controller change its behavior depending on the view?如何让控制器根据视图改变其行为?
【发布时间】:2010-03-17 18:24:49
【问题描述】:

如果从一个角度来看,用户输入了一些无效数据,例如:

    电子邮件:bill@apple.com    

然后我希望控制器:

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

但如果用户在不同的视图中输入相同的无效数据,我希望控制器:

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

但如果用户在不同的视图中输入相同的无效数据,我希望控制器:

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

另一个视图可能会:

  • 数据放入模型中
  • 让文本框不着色
  • 允许用户保存

另一个视图可能会:

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

另一个视图可能会:

  • 自动更正数据,将其放入模型中
  • 使用新数据更新视图
  • 颜色文本框蓝色
  • 允许用户保存

[无限]

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


更新

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

今天的例子:

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

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

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

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

【问题讨论】:

  • OMG <kbd> 太酷了.. 不知道
  • 你在戳我的问题源代码!?耻辱!甚至没有提供答案:(
  • 不签出源代码太酷了。我已经提出了一个答案:)
  • 哦 suuuure ....*现在*您已经提出了答案。这并没有阻止你被分散......哦,看起来像一只松鼠!

标签: model-view-controller language-agnostic


【解决方案1】:

必须对每个视图执行的操作的逻辑必须存在于某个地方。我建议您使用该信息授权视图,而不是使用多个控制器,或在单个控制器中的视图 => 配置之间创建某种映射。

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

每个视图都有特定的属性。

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 个属性(可能缺少一个或两个),控制器可以启动一系列动作,这些动作将唯一地处理每种类型的视图。视图必须将自己或属性暴露给控制器。

【讨论】:

    【解决方案2】:

    您的示例可以按照建议在视图中进行一些概括,但是,某些用例确实需要不同的控制器恕我直言。您也可以尝试在模型中添加一些逻辑。 颜色是直观的东西,控制器应该决定将数据保存在模型中是否合理,如果该数据没有决定是否应该保存的属性,让它在控制器上,可能是不同的。自动更正应该在视图和助手中。 这只是我的看法。

    【讨论】:

      【解决方案3】:

      总结问题:

      1. 您似乎想要 N 个不同的行为而不需要 N 控制器

      2. 您不想将 viewscontrollers 紧密耦合(没有 11 关系),但您希望 >controller 对每个 view 的行为进行强大而多样的控制。

      让我换一种说法:

      1. 您似乎想要 N 个不同的行为,而没有 N对象

      2. 您不想将 A 对象B 对象 紧密耦合(没有 11 关系),但是您想要 B 对象对每个 A 对象的行为进行不同的严格控制。

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

      1. 这不是MVC 的问题,它是一个经典的软件问题:要么需要 N 个对象来具有 N 个不同的行为,要么需要对行为进行参数化以便提取共性(例如Anurag 建议的方法)拥有少于 N 个单独的对象和/或诉诸巨大的案例陈述。 :-)

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

      当然,MVC 在将 Ms 与 Vs 和 Cs 分离方面取得了巨大成功,但在将 Vs 和 Cs 彼此分离方面却不太成功。我认为今天的响应式接口要求耦合视图和控制器,或者以不同的方式开始,它不值得努力和复杂地强烈隔离视图和控制器。这种修改后的M(VC) 方法在现实世界中对我来说效果更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-01-15
        • 1970-01-01
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 2012-07-26
        • 2016-11-10
        相关资源
        最近更新 更多