【问题标题】:Ajax.BeginForm check if request was redirectedAjax.BeginForm 检查请求是否被重定向
【发布时间】:2026-01-18 19:50:01
【问题描述】:

如何判断异步请求表单ajax表单是否被重定向? 在我的情况下,如果用户的会话关闭,请求将被重定向到登录页面。

我试图检查 OnComplete、OnSuccess 和 OnBegin 事件的参数(不调用 OnFailure)但没有人帮助。

目前我将整个登录页面嵌入到当前页面的 div 中,以防会话关闭。

我知道如何避免这种情况的唯一方法是这样的代码:

function onSuccessPost(a,b,c) {
   if (a.indexOf("<!DOCTYPE html>") == 0) {
      window.location = window.location;
   }
   // ...
}

但是这个解决方案似乎有点难看。

有什么想法吗?

【问题讨论】:

  • 不确定 cat 它有什么帮助。 window.Parent 在每次异步请求后都相同。

标签: asp.net-mvc-3 asp.net-ajax ajax.beginform asp.net-mvc-ajax


【解决方案1】:

不要从通过 AJAX 调用的控制器操作重定向。你可以使用 JSON:

public ActionResult Foo()
{
    var url = Url.Action("Bar", "Baz");
    return Json(new { location = url }, JsonRequestBehavior.AllowGet);
}

现在在您的 AJAX 成功回调中:

success: function(result) {
    window.location.href = result.location;
}

显然,如果您打算在 AJAX 请求后始终从客户端重定向,这将完全扼杀 AJAX 的任何好处。只需使用标准链接调用控制器操作 => 在这种情况下使用 AJAX 毫无意义。


更新:

似乎您正在尝试做的是在表单身份验证 cookie 过期时拦截到登录页面的重定向。 Phil Haack 写了一篇博客:http://haacked.com/archive/2011/10/04/prevent-forms-authentication-login-page-redirect-when-you-donrsquot-want.aspx

在本文中,他说明了如何防止表单身份验证模块自动将您重定向到登录页面,而是发送一个 401 状态代码,该代码可能被您的 AJAX 请求拦截并在客户端执行重定向。

【讨论】:

  • 在我的例子中,重定向到登录页面会自动发生。我的操作中没有重定向逻辑。但我在控制器上有一个 Authorize 属性。
  • 而且我不需要总是在 AJAX 请求后重定向。仅当会话结束时。
  • 好的,您应该在问题中说明这一点,因为这是一个非常重要的细节。看看这篇文章,了解一个非常巧妙的方法来拦截这个重定向条件:haacked.com/archive/2011/10/04/… 您现在可以在 AJAX 请求中捕获 401 错误,并防止 ASP.NET 表单身份验证模块在执行操作时自动将您重定向到登录页面通过 AJAX 请求。
  • 这正是我正在寻找的!将此评论作为答案发布,以便我接受。
【解决方案2】:
public ActionResult PossibleRedirectAction(bool isRedirect = false)
{
    ViewBag.IsRedirect = isRedirect;
}

并将此代码置于您要重定向的操作中:

RedirectToAction("PossibleRedirectAction", new {isRedirect = true});

【讨论】:

  • 如果我手动从我的操作重定向,则此解决方案将适用。但在我的情况下,重定向到登录页面会自动发生。
  • 也许你想检查 returnUrl?
  • 嗯,请求后添加了一个http响应头“Location”。但我看不到在哪里可以查看。