AJAX 和 MVC 模式

Posted

技术标签:

【中文标题】AJAX 和 MVC 模式【英文标题】:AJAX and the MVC pattern 【发布时间】:2010-10-13 08:50:03 【问题描述】:

如果存在类似问题,请重定向我。我找不到任何东西,但我确信我的问题相当普遍...

我的页面有 5-6 个 div,可以通过 Ajax 请求单独加载。通过原型 ajax.request(),服务器 (php) 在客户端刷新 div 的 innerhtml 之前回显该部门的 HTML 代码。

这是我的问题:关于它抛出的 HTML 代码,在服务器端保留 MVC 模式的最佳做法是什么?

目前,我的模型将数据库数据返回给控制器,使其能够启动一个非常长 var,其中包含它随后回显的 HTML 代码。我的问题是我的控制器类中有很多 HTML 代码......

【问题讨论】:

【参考方案1】:

如果认为 MVC 中最重要的字母是 V 用于使用 AJAX。带有 HTML 的 AJAX,而 JS 是表示层的一部分,因此理论上它是 View 的一部分。

View 负责您发送给最终用户的内容,MVC 模式不仅用于分离 Model、View 和 Controller,而且使我们能够为所提供的同一数据模型提供多个视图。

因此最好将代码封装在一个类中,并使用相同的控制器代码来呈现不同的视图。在第一种情况下,可能是静态页面的绘制,但在其他情况下,它是专为 AJAX 调用设计的视图,数据可能是 JSON 或其他标准格式,这无关紧要,只要您尊重每一层的职责.

【讨论】:

【参考方案2】:

这就是我为 MVC + AJAX 所做的...

非常简单的实现,如果你要问我的话。

http://jarrettatwork.blogspot.com/2009/02/aspnet-mvc-ajax-brief-introduction.html

【讨论】:

【参考方案3】:

你真的喜欢使用 MVC 吗? C 主要可以通过约定/RESTful URL 删除。

就像 Andy 所说,您应该使用 JSON 将数据传输到客户端。 XML 也是一种广泛使用的替代方案(因为如果其他应用程序必须使用您的服务,它的效果会更好)。 XML 可以轻松转换为 JSON! JSON 代码是有效的 javascript 对象代码。因此,您可以使用它来将客户端模板与它缝合在一起。

您应该尝试使用EJS 进行浏览器/客户端模板!如果这样做,您的控制器中就没有 HTML 样板!只是业务逻辑。这遵循了许多 SOA 最佳实践。架构模式称为 SOFEA 或 SOUI(相同)。

我已经用它写了我的主页。很多模板引擎的评估已经证明 EJS 是最佳候选者。

因为: 1.速度很快! 2. 它是免费的(MIT 许可证)! 3. 与 JQuery 配合得很好 4.它确实修改了DOM,所以其他方法可以访问使用的模板(JS Repeater没有)。

其他框架:

    JSmarty: 不太好用,但可以使用Smarty模板。它尚未经过企业验证,仍在大力开发中。

    Trimpath Javascript Templates: 不能很好地与 JQuery/Prototype 配合使用...还在开发中。

    jQSmarty: 不错,不过好像已经停止开发了。最后一次改变是在 2008 年。

    seethrough_js:侵入式模板布局。很适合 Erlang 人。

    JsonML:也是一种基于 JSON 的侵入式模板格式。你怎么看待这件事?我认为设计师应该停留在他们的 HTML/CSS 元素上,所以不会浪费任何知识。

    JS Repeater:提醒我自己的失败尝试。我已经检查过并使用它..但它不能很好地处理很多事情。 (例如空字段等)

    Pure: 是时候开始一场关于如何开发页面的 relegios 战争了?我认为 Pure 不是答案。如果您定义了真正要做的事情并且它无法像 JSF 那样扩展,那就太臃肿了。它没有侵入性语法,这非常好。但是用于渲染问题的难以使用的规则的代价对我来说是不行的。就是感觉不太对。我遇到过其他想法完全不同的人!测试一下,让我知道你的想法。

【讨论】:

【参考方案4】:

如果 HTML 主要是字符串文字,据我了解,您可能应该将 HTML 移到 ?> 完全标记并使用引用控制器设置的变量的小型内联 PHP sn-ps 从数据库中插入动态内容。

这实际上是一种模板机制。请记住,PHP 本质上是一个模板引擎。

例子:

<?php
include 'controller.php'; // set variables used below
?>
<div>
   <h1>Hi there, <?=$UserName?></h1>
   <p>Since you've been here, <?=$numberOfDays?> days have gone by</p>
</div>

等等。这也为您提供了 HTML 中的语法高亮显示,并让您不必在 PHP 代码中连接所有长字符串文字,这通常会破坏代码的可读性。

【讨论】:

这是我通常在我的代码中所做的。我的问题涉及 ajax:服务器必须以某种方式回显数据(现在它回显 div 的 html 内容).. 嗯,我想我还没明白你的问题。【参考方案5】:

您可以使用JSON 将数据传输到客户端并在那里构建它。 这样,您将拥有一个不受标记约束的抽象数据源。 JSON 可以直接评估为 javascript 对象。

【讨论】:

这可能是要做的事情......我将有更少的数据通过网络,它应该更快。非常感谢 保持 MVC 整洁的好解决方案,但速度并不快,因为您的最终用户必须从 JSON 构建 HTML。

以上是关于AJAX 和 MVC 模式的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 MVC 3 中使用 ajax 动态加载表只能在兼容模式下工作?

使用 ajax 以 mvc 模式通过控制器发送数据

Spring Mvc模式下Jquery Ajax 与后台交互操作

简单商品后台管理系统-应用MVC和AJAX,使用Bootstrap

ASP.NET MVC 通用局部视图模式

MvcPager 概述 MvcPager 分页示例 — 标准Ajax分页 对SEO进行优化的ajax分页 (支持asp.net mvc)