我目前正在处理的 MVC 项目使用区域,以便我们可以本地化页面等。
我发现我们的错误页面存在问题。我们已经在 web.config 文件中打开了自定义错误页面。如果我们在一个页面上,让我们说:/IT/News/Index 并且我们收到一个错误,当它重定向时它将转到 /Error 并且不会附加任何路由值。
是否可以确保错误页面保留语言路由值?
我已经四处寻找,目前找不到解决方案,想知道是否有其他人可以帮助或指出正确的方向?
希望这一切都有意义。任何帮助深表感谢。
我目前正在处理的 MVC 项目使用区域,以便我们可以本地化页面等。
我发现我们的错误页面存在问题。我们已经在 web.config 文件中打开了自定义错误页面。如果我们在一个页面上,让我们说:/IT/News/Index 并且我们收到一个错误,当它重定向时它将转到 /Error 并且不会附加任何路由值。
是否可以确保错误页面保留语言路由值?
我已经四处寻找,目前找不到解决方案,想知道是否有其他人可以帮助或指出正确的方向?
希望这一切都有意义。任何帮助深表感谢。
如果您在物理上被重定向到 /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
我不确定此解决方案是否满足您的要求。您可以在基本控制器中覆盖 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);
}
这取决于你如何进入错误页面,真的。如果您使用基于 - 的方法来捕获异常,那么您可以从传递给该方法ActionFilter
的上下文中获取路由值。OnException
如果您正在使用来自 catch 块的重定向,那么您可以将相关信息推送到TempData
或直接作为参数传递,具体取决于您执行该重定向的方式。
您可以添加自定义 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"];