4

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

我发现我们的错误页面存在问题。我们已经在 web.config 文件中打开了自定义错误页面。如果我们在一个页面上,让我们说:/IT/News/Index 并且我们收到一个错误,当它重定向时它将转到 /Error 并且不会附加任何路由值。

是否可以确保错误页面保留语言路由值?

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

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

4

4 回答 4

5

如果您在物理上被重定向到 /Error,那么这不是因为 MVC HandleErrorAttribute。这可能是由于您的 Web.Config 为错误处理定义了 system.web/customErrors。使用 HandleErrorAttribute 会导致它注入特定视图而不是您通常返回的视图,但默认情况下不会将您重定向到不同的操作。问题是当由于 customErrors 重定向时,没有可用的固有信息告诉您它们来自哪里。但是使用 HandleErrorAttribute 确实会为您填充一些信息。具体来说,它创建一个 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 将被复制到 Error 视图请求的 ViewData 和 Temp 数据中。有了这些信息,它应该有你需要的东西。但请注意,并非所有错误都发生在 Action 内部,并且未发生在 Action 中的异常不会被 HandleErrorAttribute 捕获。因此,您仍然需要使用 customErrors(或 system.webServer/httpErrors,如果您在 IIS7+ 内部执行此操作)来处理应用程序中其他地方发生的异常。

这是 CodePlex 上 HandleErrorAttribute 文件的链接,以防您想知道它的作用。处理错误属性.cs

于 2013-04-05T13:59:34.887 回答
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);
  }
于 2013-04-05T13:11:50.730 回答
1

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

于 2013-04-05T13:36:16.917 回答
1

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

var routeData = filterContext.RouteData;

使用该对象,您可以根据需要获取所有路由值。查看 MSDN 站点中的对象定义以获取更多详细信息

假设您有以下路线

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"];
于 2013-04-11T15:52:38.480 回答