MVC自定义错误页面可以保留路由值吗?

时间:2013-04-03 11:08:28

标签: c#-4.0 asp.net-mvc-4 error-handling

我目前正在处理的MVC项目使用Regions,以便我们可以本地化页面等。

我发现错误页面有问题。我们已在web.config文件中打开自定义错误页面。如果我们在页面上,请说:/ IT /新闻/索引,我们收到错误,当它重定向时,它将转到/错误,并且不会附加路由值。

是否可以确保错误页面保留langauge routevalue?

我已经四处寻找,目前找不到解决方案,并且想知道是否有其他人可以帮助或指出我正确的方向?

希望这一切都有意义。非常感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

如果您将物理重定向到/ Error,那么不是因为MVC HandleErrorAttribute。这可能是由于您的Web.Config已经为错误处理定义了system.web / customErrors。使用HandleErrorAttribute会导致它注入特定视图而不是您通常会返回的视图,但默认情况下不会将您重定向到其他操作。问题是由于customErrors重定向时,没有可用的信息告诉您它们来自何处。但是使用HandleErrorAttribute DOES会导致为您填充一些信息。具体来说,它创建一个HandleErrorInfo以用作视图模型并将其传递给您指定的视图。例如,这是在/App_Start/FilterConfig.cs文件中重新命名的文件。

public class FilterConfig
{
    public static void RegisterFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute {View = "Error"});
    }
}

使用HandleErrorAttribute重定向到错误视图时,会为您填充某些信息。 HandleErrorInfo视图模型将包含所请求的原始控制器的ControllerName以及原始操作的ActionName。此外,原始请求中的ViewData和TempData将被复制到ViewData和Temp数据中以获取对Error视图的请求。有了这些信息,它应该有你需要的东西。请注意,并非所有错误都发生在Action内部,并且HandleErrorAttribute不会捕获动作中未发生的异常。所以你仍然需要使用类似customErrors(或者如果你在IIS7 +中执行它们的system.webServer / httpErrors)来处理应用程序中其他地方发生的异常。

这是CodePlex上HandleErrorAttribute文件的链接,以防您想知道它的作用。 HandleErrorAttribute.cs

答案 1 :(得分:2)

我不确定此解决方案是否符合您的要求。您可以在基本控制器OnException中覆盖,然后重定向到特定页面。

  protected override void OnException(ExceptionContext filterContext)
  {
        string controller = filterContext.RouteData.Values["controller"].ToString();
        string action = filterContext.RouteData.Values["action"].ToString();
        //get other stuff from routing
        //here you can do redirect or other stuff

        //if handled exception
        //filterContext.ExceptionHandled = true;

        base.OnException(filterContext);
  }

答案 2 :(得分:1)

这取决于你是如何进入错误页面的。如果您使用基于ActionFilter的方法来捕获异常,那么您可以从传递到OnException方法的上下文中获取路由值。如果您正在使用catch块中的重定向,那么您可以将相关信息推送到TempData或直接将其作为参数传递,具体取决于您进行重定向的方式。

答案 3 :(得分:1)

您可以添加自定义HandleErrorAttribute或使用所有控制器继承的基本控制器。无论哪种方式,您都需要获取RouteData对象,如此

var routeData = filterContext.RouteData;

使用该对象,您可以根据需要获得所有路线值。 Check the object definition in MSDN site了解更多详情

假设您有以下路线

routes.MapRoute(
                "Language", // Route name
                "{language}/{controller}/{action}/{id}", // URL with parameters
                new { language = "en", controller = "Sites", action = "Index", id = UrlParameter.Optional } // Parameter default

然后routeData.Values.Keys将告诉您参数的名称和routeData.Values.Values值本身

然后,无论您在何处处理异常,都可以将路径数据存储在TempData变量中,如下所示

TempData["RouteData"]

之后,它将在您的错误页面上显示

@model System.Web.Mvc.HandleErrorInfo

@{
    ViewBag.Title = "Error";
}

<h2>
    Sorry, an error occurred while processing your request.
</h2>
@TempData["RouteData"];