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

Model view controller 在MVC模型中,谁负责清理输入?,model-view-controller,Model View Controller,一个简单的问题:我有一个模型视图控制器设置,模型访问SQL数据库。我应该在哪一部分清理/检查格式错误的传入数据?我想说,在将数据传递到模型之前,控制器有责任验证输入并确保数据有效 如果发现无效数据,控制器应重定向回视图并显示相关错误消息 如果用户未启用javascript或未直接发布到url,则只能绕过视图中的验证,但是从用户体验的角度来看,视图中的某些验证更好,因为用户不需要在web应用程序中等待服务器返回。我倾向于: 在视图中放入语法验证(“此字段为数字”,“该字段为日期”)。这通常非常简

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

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

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

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

我倾向于:

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

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


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

我认为控制器应该清理输入


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

在堆栈中保持尽可能低的错误处理非常重要,但在其他部分则是补充。如果您在控制器中保持清理,您可以通过用一个较松的控制器替换控制器来破坏模型,但是您永远不能通过在堆栈中更高的位置严格执行来破坏模型。在堆栈中保持低消毒以保持一致性,在堆栈中保持高消毒以获得用户反馈。

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

显然,该模型还应该确保以安全的方式与数据库进行交互,这样就不可能进行SQL注入

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


我想说的是,在传递到视图之前,输出清理也应该进入控制器。

我使用两个级别的检查。我的控制器将检查什么应该是日期,什么是日期,什么是整数,等等。基本上确保它们可以用于设置对象上的值

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


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

这取决于验证是域逻辑的一部分还是界面的一部分。我将“验证”和“清理”理解为两个完全不同的主题。验证只是拒绝格式不正确的数据。净化意味着接受输入并将其转换为一种通用的、合理的格式(剥离空间,…)。这些更改可能会也可能不会影响数据的有效性。这取决于验证是否是域逻辑的一部分。仅在控制器中执行验证将使交换控制器/视图集更加困难,并可能导致代码重复。此问题涉及来自用户输入的格式错误的数据,应在控制器中进行检查。业务规则验证是不同的,应该在模型中完成,我想我应该更清楚…我这样看。。。你总是要在坐上马桶之前把马桶座圈清理干净,不管你之前的人是否在他完成后把马桶座圈清理干净。然而,冗余会破坏循环。