0

有没有办法让由 AJAX 请求启动的 MVC 操作可以将响应直接重定向到另一个页面/视图,而无需先向客户端发送 JavaScript “<em>window.location=...”</em>?换句话说,直接在服务器端传输响应,避免到客户端的往返。

这是一个关于直接传输 AJAX 调用的可能性的更普遍的问题,但这里有一个更具体的场景:

  1. 浏览器向服务器发送 AJAX 请求,控制器的逻辑根据请求数据执行一些操作。
  2. 对于大多数情况,控制器需要将结果 (JSON) 返回到同一页面。但是,在少数情况下,它需要重定向到另一个页面并返回一个脚本来重定向页面,但这会导致浏览器再次往返。流程是:Page - Server - Page - Server - New Page,问题是这是否可以优化为 Page - Server - New Page 。
4

1 回答 1

0

这真的不可能,不。

浏览器有两个选项可供选择:

  • 转到一个页面
  • 对页面进行 AJAX 调用

它无法进行 AJAX 调用并根据服务器的决定自动重定向,因为客户端(浏览器)甚至在浏览器收到响应之前都不知道服务器已经决定了什么。

传统方法(您要避免)是:

  • 浏览器向服务器发出异步请求
  • 服务器响应数据通知客户端重定向
  • 客户端通过以下方式向服务器发出新请求window.location
  • 服务器响应新页面

但是,您想跳过一个步骤:

  • 浏览器向服务器发出异步请求
  • 客户端通过以下方式向服务器发出新请求window.location
  • 服务器响应新页面

但是客户端不知道它需要重定向和/或它不知道如何重定向。

一种(丑陋的)可能性

想到伪实现您想要的一个想法是让 MVC 呈现所需的视图并通过 JSON 而不是重定向方法将整个内容发送回客户端。让我解释。

  • 浏览器向服务器发出异步请求
  • 服务器确定需要显示哪个页面并渲染视图(在 MVC 中生成没有控制器的视图
  • 服务器将生成的 HTML 序列化为 JSON
  • 客户端收到 JSON,并使用新标记重新渲染整个页面(即完全替换)

您还可以通过操纵浏览器历史记录来更改浏览器的 URL 和历史记录,使其“感觉”像重定向。

但是我想指出,这种“解决方案”更像是一种有趣/有趣的方法。这不是解决问题的好方法。

于 2013-11-11T02:47:17.733 回答