asp.net mvc Response.Redirect在global.asax中不起作用

时间:2015-01-21 13:33:36

标签: c# asp.net-mvc asp.net-mvc-4 asp.net-mvc-5

当我在应用程序中发生任何异常时,我试图重定向到asp.net mvc5的global.asax文件中的错误页面。执行Response.Redirect行后没有任何事情发生。

它根本没有重定向到路径中可用的errorpage~ \ View \ Shared \ Error.cshtml

protected void Application_Error(object sender, EventArgs e)
{   
    Server.ClearError();
    Response.Clear();      
    HttpContext.Current.Response.Redirect("~\View\Shared\Error.cshtml");    
   //return;               
}

并在webconfig中

<system.web>
    <customErrors mode="On" defaultRedirect="~\View\Shared\Error.cshtml" />
</system.web>

我不确定出了什么问题。

我的错误控制器:

public class ErrorController : Controller
    {
        // GET: Error
        public ActionResult Error()
        {
            return View("Error");
        }

    }

2 个答案:

答案 0 :(得分:3)

我不建议使用Global.asax,除非你有一些自定义逻辑。我建议使用web.config。请注意,由于MVC使用路由而不是物理文件,因此您应该在web.config中使用类似的东西:

<httpErrors errorMode="Custom"> <remove statusCode="404"/> <error statusCode="404" path="/error/404" responseMode="ExecuteUrl"/> <httpErrors>

但是如果你想调用一些物理文件(例如html),你应该以这种方式使用它:

<httpErrors errorMode="Custom"> <remove statusCode="404"/> <error statusCode="404" path="/erro404.html" responseMode="File"/> <httpErrors>

现在,回到自定义逻辑。如果你真的需要使用Global.asax,我建议你使用这样的东西:

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Response.Clear();

    HttpException httpException = exception as HttpException;

    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Error");

    if (httpException == null)
    {
        routeData.Values.Add("action", "Index");
    }
    else //It's an Http Exception, Let's handle it.
    {
        switch (httpException.GetHttpCode())
        {
            case 404:
                // Page not found.
                routeData.Values.Add("action", "HttpError404");
                break;
            case 500:
                // Server error.
                routeData.Values.Add("action", "HttpError500");
                break;

            // Here you can handle Views to other error codes.
            // I choose a General error template  
            default:
                routeData.Values.Add("action", "General");
                break;
        }
    }

    // Pass exception details to the target error View.
    routeData.Values.Add("error", exception);

    // Clear the error on server.
    Server.ClearError();

    // Avoid IIS7 getting in the middle
    Response.TrySkipIisCustomErrors = true;

    // Call target Controller and pass the routeData.
    IController errorController = new ErrorController();
    errorController.Execute(new RequestContext(
            new HttpContextWrapper(Context), routeData));
}

答案 1 :(得分:1)

你做错了。

~返回应用程序根目录的物理路径,但显然是我的更改。

使用Server.MapPath()方法检查案例中哪条路径是正确的。请遵循以下列表:

  • Server.MapPath(".")返回正在执行的文件的当前物理目录(例如aspx)
  • Server.MapPath("..")返回父目录
  • Server.MapPath("~")返回应用程序根目录的物理路径
  • Server.MapPath("/")返回域名根目录的物理路径(不一定与应用程序的根目录相同)

也可以查看this brilliant answer