在MVC模型中,谁负责清理输入?

时间:2008-12-15 11:58:05

标签: model-view-controller

一个简单的问题:我有一个模型 - 视图 - 控制器设置,模型访问SQL数据库。我应该在哪一部分清理/检查格式错误的传入数据?

6 个答案:

答案 0 :(得分:12)

在堆栈中保持错误处理尽可能低是很重要的,但在其他部分中是补充的。如果你在控制器中保持消毒,你可以通过更宽松的控制器更换控制器来打破模型,但是你永远不能通过在堆栈中严格更高的位置来破坏模型。保持堆栈中的消毒量低以保持一致性,并在堆栈中保持较高水平以便用户反馈。

答案 1 :(得分:3)

我说控制器应该清理输入。

模型最多应拒绝存储无效数据。

答案 2 :(得分:1)

我想说控制器有责任在将数据传递给模型之前验证输入并确保数据有效。

如果找到无效数据,控制器应重定向回视图并显示相关的错误消息。

如果用户没有启用javascript或直接发布到网址,则只能绕过视图中的验证,但是从用户体验的角度来看,视图中的某些验证更好,因为用户不需要等待Web应用程序中服务器的返回。

答案 3 :(得分:1)

如果允许用户执行操作,模型将验证业务逻辑规则,即密码长度要求。

该模型显然还应确保以安全的方式完成与数据库的交互,以便无法进行SQL注入。

控制器应处理将业务逻辑错误中继回视图,但也可以进行一些基本的健全性检查,即字段不为空。

我想说输出清理也应该在传递给View之前进入Controller。

答案 4 :(得分:1)

我使用两级检查。我的控制器将检查应该是一个日期是一个日期,一个int和一个int等等。基本上确保它们可用于设置对象的值。

然后我的域验证了有效值和其他业务规则等内容。在保存或与编辑对象交互之前,始终检查这些内容。

任何级别的所有错误都会返回给用户,以便他们可以根据需要采取补救措施。

答案 5 :(得分:0)

我倾向于:

  • 在视图中放置语法验证(“此字段为数字”,“该字段为日期”)。在您选择的视图设计中,这通常非常容易甚至隐含(例如:使用日期字段的日期选择器)。

  • 语义违规放在一个单独的验证器类中(“此日期字段必须在该日期字段之后”,“如果大于零则可以为null”)并调用来自控制器的验证器,将错误传递回视图以供显示。

(对于我自己的语法和语义的伪正确定义......)