使用服务器将 AJAX 请求重定向到另一个页面/视图 传输 ASP.Net MVC



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

这是一个关于直接传输 AJAX 调用的可能性的更一般的问题,但这里有一个更具体的方案:

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

这真的不可能,不。

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

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

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

传统方法(您正在避免)是:

  • 浏览器向服务器发出异步请求
  • 服务器使用数据进行响应,通知客户端重定向
  • 客户端通过window.location向服务器发出新请求
  • 服务器使用新页面进行响应

但是,您希望通过执行以下操作跳过步骤:

  • 浏览器向服务器发出异步请求
  • 客户端通过window.location向服务器发出新请求
  • 服务器使用新页面进行响应

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

一种(丑陋的)可能性

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

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

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

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

最新更新