MVC错误页面控制器和自定义路由

时间:2014-02-10 14:19:38

标签: c# asp.net asp.net-mvc routing asp.net-mvc-routing

我修改了路由以将文化包含在网址

routes.MapRoute(
            name: "Default",
            url: "{culture}/{controller}/{action}/{id}",
            defaults: new { culture = "en-GB", controller = "StyleGuide", action = "Template", id = UrlParameter.Optional },
            constraints: new { culture = @"[a-z]{2}-[A-Z]{2}" }
        );

我还创建了ErrorController并在Web.config中定义了错误页面:

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

我也在使用mvcSiteMapProvider,所以我已经包含了我的新错误页面,并且能够通过菜单访问它们,因为它使用包含我的文化的URL:localhost/en-GB/Error/NotFound

当抛出异常时,找不到错误页面,因为Web.Config中定义的重定向缺少文化。

如何在重定向到错误页面时包含文化?

1 个答案:

答案 0 :(得分:1)

这是一篇很好的文章,描述了ASP.NET MVC中错误处理方法的可能性和局限性:Exception Handling in ASP.NET MVC

如果您不需要控制器或操作级别异常处理,则可以在Application_Error事件中执行错误处理。您可以在web.config中关闭自定义错误,并在此事件中执行日志记录和错误处理(包括重定向到正确的页面)。

类似的东西:

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

    HttpException httpException = exception as HttpException;  

    string action = string.Empty;    

    if (httpException != null)
    {
        switch (httpException.GetHttpCode())
        {
            case 404:
                // page not found 
                action = "NotFound";
                break;
            //TODO: handle other codes
            default:
                action = "general-error";
                break;
        }
    }
    else
    {
        //TODO: Define action for other exception types
        action = "general-error";
    }

    Server.ClearError();

    string culture = Thread.CurrentThread.CurrentCulture.Name;    

    Exception exception = Server.GetLastError();
    Response.Redirect(String.Format("~/{0}/error/{1}", culture, action));
}