4

当它是 json 帖子时,如何阻止 asp.net mvc 重定向到错误页面?当发生异常并且我需要它返回异常时,它会一直尝试重定向到我的配置文件中的错误路径......而且它甚至没有尝试将它们引导到正确的路径 - 它一直在寻找错误。当它们都位于设置的错误文件夹/控制器下时(视图的主文件夹,好像它正在尝试使用我的主控制器)下的 cshtml 视图,这在我的配置文件中明确列出:

<customErrors mode="On" defaultRedirect="~/Error/Error">
  <error statusCode="404" redirect="~/Error/NotFound" />
  <error statusCode="403" redirect="~/Error/Forbidden" />
</customErrors>

谢谢!

4

2 回答 2

1

您可以通过在 Global.asax 中注册 Application_Error 事件来做到这一点,然后以这种方式将其重定向到带有数据的错误控制器,或者您可以根据错误代码执行您想要的任何功能

protected void Application_Error()
        {
            var exception = Server.GetLastError();
            var httpException = exception as HttpException;
            Response.Clear();
            Server.ClearError();
            var routeData = new RouteData();
            routeData.Values["controller"] = "Error";
            routeData.Values["action"] = "oops";
            routeData.Values["exception"] = exception;
            Response.StatusCode = 500;
            if (httpException != null)
            {
                Response.StatusCode = httpException.GetHttpCode();
                switch (Response.StatusCode)
                {
                    case 403:
                        routeData.Values["action"] = "NoAccess";
                        break;
                    case 404:
                        routeData.Values["action"] = "NotFound";
                        break;
                }
            }

            IController errorsController = new ErrorController();
            var rc = new RequestContext(new HttpContextWrapper(Context), routeData);
            errorsController.Execute(rc);
        }

然后用 oops / NotAccess / NotFound 之类的动作制作一个控制器

public ActionResult oops(Exception exception)
        {
            //return Content("General failure", "text/plain");

           // return View();

        }

        public ActionResult NotFound()
        {
           // return Content("Not found", "text/plain");
          //  return View("oops");
        }

        public ActionResult NoAccess()
        {
            //return Content("Forbidden", "text/plain");
            //return View("oops");
        }

并用适当的信息返回您自己的观点

于 2012-05-18T20:28:09.947 回答
0

解决方案 1:您可以为所有控制器使用 BASE 控制器(拥有它是个好主意),并且在此控制器中,您可以像这样覆盖 OnException 方法:

    protected override void OnException(ExceptionContext filterContext)
    {
        if (Request.IsAjaxRequest())
        {
            // TODO
        }
        else
        {
            base.OnException(filterContext);
        }
    }

解决方案 2:您可以创建自定义操作过滤器来完成上述工作和使用方法。你可以在 global.asax 中注册这个过滤器,或者只装饰你需要的那些控制器/动作。

一般的想法是使用:

Request.IsAjaxRequest()

希望能帮助到你。祝好运并玩得开心点 :)

于 2012-05-18T21:05:25.280 回答