1

我正在从AJAX调用一个函数

$.ajax({
         type: "POST",
         url: "GetOneApple",
         data: {},
         dataType: "json",
         success: function (data) {}
});

家庭控制器:

[HttpPost]
public ActionResult GetOneApple()
{
     try
       {
      ..snip
       }
     catch (Exception e)
       {
           return RedirectToAction("ErrorPage", "Home");
       }
}

在 catch 块中,我也试过这个:

return new RedirectToRouteResult(new RouteValueDictionary {
    { "Controller", "Home" }, 
    { "Action", "ErrorPage" }
});

我有一个像这样的 ErrorPage 控制器

 public ActionResult ErrorPage()
        {
            return View();
        }

正如我所提到的,
如果在 try 块中发生任何错误,它必须重定向到 ErrorPage 但页面没有重定向,使用firebug我从控制器的AjaxResponse中获得了“ErrorPage”html ,即使它没有重定向到“ErrorPage”视图

我错过了什么?我对此有点陌生,所以希望有一个我无法找到的简单答案......

4

2 回答 2

2

你混淆了两个概念:

  1. AJAX 调用正在使用 REST 接口
  2. 您希望导航到错误页面的 Web 应用程序。

您的 REST API 应始终响应请求,绝不要求客户端重定向。相反,如果发生错误,则以 JSON 格式返回错误详细信息,例如

{ status: "error", message: "Error so and so" }

以及错误的 HTTP 代码。您可以这样实现:

catch (Exception ex)
{
    Response.StatusCode = 500; // put a reasonable code here
    return Json(new { status = "error", message = ex.Message });
}

在您的 JavaScript 中,您可以通过 AJAX 使用错误回调来“捕捉”它。然后你的 JavaScript 决定下一步做什么。如果要向用户显示错误,可以使用 JavaScript 将消息呈现为 HTML。

(备注:只有在整个页面请求无效时,您通常会将浏览器重定向到错误页面。如果您在有效页面上并且只有一个 AJAX 调用失败,您不会想卸载有效页面并转到错误页面 URL(?)。即使您的浏览器发出失败的页面请求,我通常更喜欢从该 URL 呈现错误响应,而不是将浏览器重定向到“错误页面”。原因是重定向会改变地址栏中的地址并将其自身添加到历史记录中。例如,如果您的用户想通过单击“刷新”按钮重试,浏览器将不会重做之前导致错误的相同操作。相反,它会简单地重新加载错误页面,即使原来的用例现在可以工作了。)

于 2014-01-17T11:36:39.220 回答
1

您能否不返回错误并按此处所示处理失败(请参阅页面上最后一个示例的第二个)?然后,您将使用类似这样的东西进行重定向。

直接的 RedirectToAction 应该可以工作。假设您的目标是正确的控制器,也许您可​​以尝试在 try catch 中设置一个标志并在 catch 之外重定向。

我倾向于不使用 RedirectToRouteResult,但是这里回答了关于何时使用它的问题。

抱歉,这不是一个“这样做,一切都会好起来的”的答案,但希望它能帮助您朝着正确的方向前进。

于 2014-01-17T11:27:08.960 回答