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

时间:2013-11-11 01:22:30

标签: ajax asp.net-mvc

是否有一种方法可以将由AJAX请求启动的MVC Action直接重定向到另一个页面/ View,而无需先向客户端发送JavaScript“ window.location = ...” ?换句话说,直接在服务器端传输响应并避免往返于客户端。

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

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

1 个答案:

答案 0 :(得分:0)

这不可能,不。

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

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

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

传统的方法(你要避免的)是:

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

但是你想跳过这一步:

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

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

一种(丑陋的)可能性

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

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

您还可以更改浏览器的网址和历史记录,使其“感觉”像是manipulating the browser history的重定向。

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