好的,之前可能已经提出这个问题,但我找不到一个明确的答案。在MVC模式中应该对输入进行验证吗?
我想说,空字段和基本的一般验证之类的东西应该在控制器中发生,并且规则作为例如用户名/密码等的长度和有效字符应该在模型层发生。
然而,这意味着将这个burdon传播到应用程序周围肯定也不好?
很抱歉,如果这个问题没有问题,但我对这种类型的编程比较陌生,并希望从一开始就把事情弄清楚。
答案 0 :(得分:6)
验证是模型的工作。
由于模型具有各种属性(字段),因此只有模型才能知道哪种输入组合使该模型有效。它不仅仅是一个字段是空白的,还是该字段的输入与某个模式匹配,但有时这是字段输入的组合,或者模型与确定有效状态的其他模型的关系。
你的模型应该封装这个逻辑,这样你就可以查询它(“你有效吗?”),而不是把它分散到代码的其他部分。
答案 1 :(得分:3)
没有一个答案。将开始浮出水面的是验证不能仅仅发生在模型上,因为模型不了解其周围环境。一个典型的例子是重复的名称,其中唯一性很重要,形成一种视觉立场。在需求出现的那一刻,某种验证将发生在模型外部,或者模型必须意识到其开始耦合的环境。
我尝试尽可能多地推进模型,这与模型/要求有关。一旦超出该范围,唯一的其他地方就在控制器内。
答案 2 :(得分:2)
我同意没有独特的解决方案。
我倾向于在控制器中保留验证,该验证与应用程序的逻辑相关。在模型可以变化的情况下,这具有很好的优势(否则您需要在所有模型中复制检查)。
在模型中,我只保留验证,这取决于存储机制。
视图可以是实施某些客户端验证的好地方,以便立即反馈。
同样,这只是我的意见。
答案 3 :(得分:1)
我个人在Controller中都验证了模型,但是我倾向于仅在Controller 中进行验证,以确保应该加载某个Model函数。所以基本上:验证以便控制。
示例:有人尝试更新将表单发布到?p=foo&bar=1&baz=2
的某些信息。在Controller中,我将检查值1和2是否是实际数字,并且它是有效请求。甚至可以检查用户是否可以访问此特定信息。
如果是这种情况,我会调用模型中的更新功能,然后验证所有发布的表单数据。如果没有,通常意味着用户不应该首先在那里,甚至不会到达模型。
答案 4 :(得分:0)
我同意安德鲁。这是模型的工作,负责数据验证。当然,您可以在任何地方进行验证,但在模型中进行验证是最佳实践。