AJAX 和 jQuery 与 MVC
Posted
技术标签:
【中文标题】AJAX 和 jQuery 与 MVC【英文标题】:AJAX and jQuery with MVC 【发布时间】:2011-09-20 21:55:00 【问题描述】:当您使用带有大量 AJAX 位的 jQuery 的 MVC 模型时,您如何组织控制器、方法和视图?
问题 1
您是否有一个单独的控制器仅用于 AJAX 调用,或者您是否将 AJAX 方法与常用的非 AJAX 方法混合在一个控制器中?
问题 2
如果要在单个控制器中混合 AJAX 和非 AJAX 方法,是否有单独的 AJAX 和非 AJAX 方法,或者将它们组合在一起(如果可能)并传入一个值(NULL 或 AJAX)这决定了将普通视图还是 AJAX 视图传递回浏览器。
问题 3
如果您有 50 个不同的 AJAX 调用,并且每个调用都需要一个方法,而该方法又需要一个视图,那么我们最终会得到一个具有 50 个方法和 50 个视图的控制器。这是良好的 MVC 实践吗?我可以想到控制器中的所有 AJAX 方法共享一个视图,其中视图文件包含 case 条件语句,并且视图文件传递了一个参数,该参数确定将使用 50 个 case 中的哪一个。有点像将 50 个视图压缩为 1 个。
问题 4
您认为在控制器方法中而不是在视图中回显输出,而不是拥有这么多视图(50 个视图)?这样我们的浏览量就不会那么多了。
顺便说一句,我正在为我的 MVC 模型使用 CodeIgniter php 框架
【问题讨论】:
【参考方案1】:问题 1 - AJAX 的单独控制器。如果您使用的是 servlet,那么您应该使用新的 servlet 3.0 支持来支持异步。
http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=2
问题 2 - 由于我们使用单独的控制器,因此不适用。
问题 3 - 您是否看到有 50 个唯一调用而没有重叠功能的场景? 尽管您有 50 个 AJAX 调用,但在服务器端可以重用很多次来处理这些请求。所以 50 个调用不等于 50 个方法。您可以使用命令包装每个请求并适当地执行,而不是使用可能失控的 if else。
问题 4 - 50 次通话可能不等于 50 次观看。你也需要在这里重用。您需要分离出视图组件并组装它们。归结为设计。
【讨论】:
【参考方案2】:当您进行 jQuery AJAX 调用时,jQuery 会添加一个 X-Requested-With HTTP 标头,您可以使用它来确定给定请求是否是 AJAX 请求。考虑到这一点,在 AJAX 和传统请求之间共享相同的控制器操作通常是有意义的,构建一个模型,然后使用该模型为传统请求渲染视图,或者使用 AJAX 相同模型的 JSON 序列化表示进行响应请求。
【讨论】:
【参考方案3】:问题 1
我将 ajax 和非 ajax 代码混合到同一个控制器中。这样一来,您的代码就在一个容易找到的公共位置。
问题 2
我将 ajax 和非 ajax 方法结合在一起。使javascript Progressive Enhancement 的使用更容易,因此没有 javascript 的人仍然可以发布到同一个控制器
问题 3
你不应该有 1 个控制器和 50 个方法。每个功能都应该有一个控制器。所以一个用户控制器、一个 Foo 控制器、一个 Bar 控制器——所以你最终可能会得到 10 个控制器,每个控制器有 5 个方法。这种方式方法属于特定于其功能的类。我有不同的观点,而不是一个大观点。您不应该在视图中使用 LOGIC 来确定显示的内容,这是控制器的工作。但是某些控制器/方法可以返回与其他方法相同的视图
问题 4
或者控制器不应该输出 HTML。为此使用视图,这是 MVC 的全部目的,以分离出代码(控制器)视图(渲染)关注点。有时我的视图只返回 JSON 或 XML,然后我使用 Javascript 模板来更新 DOM。有时我的视图返回 HTML。例如表单上的保存功能。如果成功,可能只返回一个布尔值。然后我的 Javascript 会根据响应隐藏或显示一个 DIV。
【讨论】:
顺便说一句,我使用 MVC .NET 所以 YMMV 用于 PHP 我有 admincontroller,这有 70 个方法。我的整个 admin 使用一个控制器太糟糕了。我在哪里可以找到好的 mvc 架构。以上是关于AJAX 和 jQuery 与 MVC的主要内容,如果未能解决你的问题,请参考以下文章