【问题标题】:Validation Layer in MVC patternMVC 模式中的验证层
【发布时间】:2010-12-26 01:46:04
【问题描述】:

哪里是验证模型将使用的数据的最佳位置。例如,考虑一下注册表。我们有一些来自注册表的数据。那么验证这些数据的最佳位置在哪里。我们应该通过 if 语句或特殊的验证器类检查每个数据,这意味着大量的编码,所以我想知道在哪里可以做到这一点。

在控制器中?还是型号?

两者都有? 因为有些数据应该被其他模型验证?

如果您不确定确切的答案,请尝试找出两种方式可能的优缺点。

【问题讨论】:

    标签: php model-view-controller model validation


    【解决方案1】:

    验证数据的来源应该在模型中,而实际检查可能应该在视图级别(可能使用 javascript 或 UI 提示)和模型级别进行。纯粹主义者会建议不应涉及该观点,但我不同意。

    【讨论】:

    • 纯粹主义者是对的,但纯粹主义者也在桌面应用程序编程方面学到了手艺。在 Web 上,在视图和模型中执行此操作具有节省往返 HTTP 请求的优势。如果你拥有一个桌面应用程序,所有东西都在同一台机器上,通常占用相同的内存空间,那么这种方法很容易被嘲笑。所以你可能是对的。两者都做。
    • 我不会使用 Javascript 进行验证,因为它可能会被黑客入侵/欺骗/禁用。仅在不显眼的情况下使用它来改善用户体验(即没有请求-响应周期,也没有内容闪现)。
    • 我同意。数据应传递给模型(在本例中为 $_POST 数组)并在那里进行验证。我也同意视图中的js。
    • @BalusC 的一个好观点。使用 xVal 时 ASP.net MVC 2 甚至版本 1 的一个非常好的特性是,您可以使用Required 和 StringLength(50, minLength=10) 等属性对模型进行注释,它会生成 javascript 验证以及验证模型时它被传递到控制器中。我不知道这在其他 MVC 框架中是如何工作的
    【解决方案2】:

    当然不是在控制器中,它的唯一任务应该只是控制请求/响应并熟悉模型和视图。在商业模式中做到这一点。不是使用一堆 if 语句,而是使用 for 循环和抽象验证框架。

    视图中的验证只能用于改善用户体验。在 webapps 中,视图基本上是 HTML 页面。在这种情况下,只有完全在客户端运行的 Javascript 才能进行验证。客户端可以完全控制它,例如破解/禁用它。 使用 JS 验证来改善用户体验(即更快的响应,无内容闪现)。仍然在服务器端进行(相同的)验证以获得更好的鲁棒性。

    【讨论】:

    • 但是有些数据需要经过其他模型的验证?比如在添加收藏视频行之前,我们应该检查视频是否存在。
    • 在商业模式中也是如此。注意,业务模型,而不是数据模型。
    • 对不起,我想我对这些术语及其定义并不熟悉。你能提供任何我可以学习的资源
    【解决方案3】:

    在你的模型中加入验证可以避免你在一堆控制器中重复验证代码。

    【讨论】:

      【解决方案4】:

      我认为应该在模型和视图中都进行验证。

      【讨论】:

        猜你喜欢
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        相关资源
        最近更新 更多