C# 4.0 MVC自定义错误页能否保留路由值?
我目前正在从事的MVC项目使用区域,以便我们可以本地化页面等 我发现我们的错误页面有问题。我们已打开web.config文件中的自定义错误页。如果我们在一个页面上,我们可以说:/IT/News/Index,然后我们得到一个错误,当它重定向时,它将转到/error,并且不会附加routevalue 是否有办法确保错误页面保留langauge routevalue 我四处寻找,目前找不到解决方案,我想知道是否有其他人可以帮助我或为我指明正确的方向C# 4.0 MVC自定义错误页能否保留路由值?,c#-4.0,asp.net-mvc-4,error-handling,C# 4.0,Asp.net Mvc 4,Error Handling,我目前正在从事的MVC项目使用区域,以便我们可以本地化页面等 我发现我们的错误页面有问题。我们已打开web.config文件中的自定义错误页。如果我们在一个页面上,我们可以说:/IT/News/Index,然后我们得到一个错误,当它重定向时,它将转到/error,并且不会附加routevalue 是否有办法确保错误页面保留langauge routevalue 我四处寻找,目前找不到解决方案,我想知道是否有其他人可以帮助我或为我指明正确的方向 希望这一切都有意义。非常感谢您的帮助。我不确定此解决
希望这一切都有意义。非常感谢您的帮助。我不确定此解决方案是否满足您的要求。您可以在基本控制器中重写OneException,然后重定向到特定页面
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
或直接将其作为参数传递,具体取决于重定向的方式。如果物理重定向到/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将复制到错误视图请求的ViewData和Temp data中。有了这些信息,它应该有你所需要的。但是,请注意,并非所有错误都发生在操作内部,并且HandleErrorAttribute不会捕获操作中未发生的异常。因此,您仍然需要使用customErrors(或者system.webServer/httpErrors,如果您是在IIS7+中执行此操作的话)来处理应用程序中其他地方发生的异常
这里有一个指向CodePlex上HandleErrorAttribute文件的链接,以防您想知道它的作用 您可以添加一个自定义HandleErrorAttribute,或使用一个基础控制器,以便由所有控制器继承。无论哪种方式,都需要获取RouteData对象,如下所示
var routeData = filterContext.RouteData;
使用该对象,您可以根据需要获得所有路由值。更多细节
假设你有下面的路线
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"];
@model System.Web.Mvc.HandleErrorInfo
@{
ViewBag.Title=“错误”;
}
很抱歉,处理您的请求时出错。
@TempData[“路由数据”];
我在web.config中将自定义错误设置为打开,因为我们不希望用户看到YOSD。我们还使用ELMAH捕获所有错误。那么你是说我可以通过某种方式把语言作为一个HandleErrorAttribute传递进来?还是只有在我们不使用自定义页面的情况下才这样做?我在我的应用程序中也使用Elmah,并且有许多支持Elmah的HandleErrorAttribute的实现。我当前的应用程序实际上正在使用filters.Add(new Elmah.Contrib.Mvc.ElmahHandleErrorAttribute(){View=“Error”})代码>当前如何在页面之间持久化语言路由值?因为HandleErrorAttribute
的默认实现在将ActionResult交换到它指示使用的视图时复制TempData,在TempData中将其设置为变量可能是将其持久化到错误视图中的最简单方法