如何让控制器根据视图改变其行为?

时间:2010-03-17 18:24:50

标签: model-view-controller language-agnostic

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

电子邮件: bill@apple.com

然后我希望控制器:

  • 将数据放入模型
  • 为文本框添加颜色带红色
  • 允许用户保存

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

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

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

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

另一种观点可能会出现:

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

另一种观点可能会出现:

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

另一种观点可能是:

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

[ad infinitum]

不使用n-controllers进行n视图,我该怎么做?


更新

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

今天的例子:

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

  • 除非数据来自其他视图。在这种情况下,自动修剪某些字段以适合数据库规则

  • 除非数据来自其他视图。在这种情况下,要求数据库抛出它的truncated异常

我在阅读的书籍/文章/博客中看不到MVC的许多实际问题 - 难怪我不会使用它。

3 个答案:

答案 0 :(得分:1)

每个视图必须完成的逻辑必须驻留在某个地方。我建议您使用该信息授权视图,而不是使用多个控制器,或者在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个属性(可能缺少一个或两个),控制器可以启动一系列操作,这些操作将唯一地处理每种类型的视图。视图必须将自己或属性暴露给控制器。

答案 1 :(得分:1)

您的示例可以在视图中进行一些推广,但是,某些用例确实需要不同的控制器imho。您也可以尝试在模型中添加一些逻辑。 颜色是直观的东西,控制器应该决定将数据保存在模型中是否合理,如果该数据没有决定是否应该保存的某些属性,请将它放在控制器上,可能是不同的。自动更正应该在视图和帮助程序中。 那只是我的意见。

答案 2 :(得分:0)

总结问题:

  1. 如果没有 N 控制器,您似乎想要 N 不同的行为。

  2. 您不希望与视图控制器(没有1&lt; - &gt; 1关系)紧密结合,但您想要< strong>控制器,可以对每个视图的行为进行强有力的控制

  3. 让我以不同的方式说明:

    1. 在没有 N 对象的情况下,您似乎想要 N 不同的行为。

    2. 您不想紧密耦合 A对象 B对象(没有1&lt; - &gt; 1关系),但您想要< strong> B object 对每个 A对象的行为进行严格控制。

    3. 以下是我看到这两个问题的方法:

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

      2. 这个不是MVC的问题,而是它的权衡之一。 MVC让我们将M,V和C代码分离,以方便将来的更改(例如更改或添加视图)。但是权衡不是免费的,组件必须具有较少的知识和彼此的控制。要么放弃控制器对视图的严格控制(没有 N 不同类型的行为),要么放弃C和V之间的隔离(例如,允许1&lt; - &gt; 1紧耦合视图控制器)。

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

相关问题