Asp.net mvc 如何在json发布期间发生异常时阻止asp.net mvc重定向到错误控制器

Asp.net mvc 如何在json发布期间发生异常时阻止asp.net mvc重定向到错误控制器,asp.net-mvc,Asp.net Mvc,当asp.net mvc是json帖子时,如何阻止它重定向到错误页面?当出现异常时,它一直试图重定向到配置文件中的错误路径,我需要它返回异常…而且它甚至没有尝试将它们指向正确的路径-它一直在Home(视图的主文件夹,好像它正在尝试使用my Home controleler)下查找error.cshtml视图,当它们都处于错误文件夹/控制器设置下时,这在我的配置文件中有明确说明: <customErrors mode="On" defaultRedirect="~/Error/Error"&

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

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


谢谢

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

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");
        }
并返回您自己的视图和适当的信息

解决方案1: 您可以为所有控制器使用基本控制器(最好使用它),并且在此控制器中,您可以像下面这样重写OneException方法:

    protected override void OnException(ExceptionContext filterContext)
    {
        if (Request.IsAjaxRequest())
        {
            // TODO
        }
        else
        {
            base.OnException(filterContext);
        }
    }
解决方案2: 您可以创建自定义操作筛选器来执行此任务,并使用上述方法。然后,您可以在global.asax中注册此筛选器,或仅装饰您需要的控制器/操作

总体思路是使用:

Request.IsAjaxRequest()

希望能有帮助。祝你好运,玩得开心:)

在控制器方法中捕获异常?如果您自己处理异常,它不应该传播到错误控制器。好的,但是,为什么它会尝试重定向到my Home文件夹下的错误视图?它应该在error views文件夹中查找它?谢谢你想要哪一个。。。根本没有错误重定向,还是让它重定向到正确的位置?为了让事情更清楚,我会将“重定向到错误的地方”作为一个单独的问题发布,并为其添加一些细节。好吧,我想这两个问题都是单独的,因为对于任何不是json post/get的问题,我都希望重定向到错误页面(它只会在幕后记录异常)。那么我将把它作为一个单独的问题发布。再次感谢!