Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 MVC自定义错误页能否保留路由值?_C# 4.0_Asp.net Mvc 4_Error Handling - Fatal编程技术网

C# 4.0 MVC自定义错误页能否保留路由值?

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 我四处寻找,目前找不到解决方案,我想知道是否有其他人可以帮助我或为我指明正确的方向 希望这一切都有意义。非常感谢您的帮助。我不确定此解决

我目前正在从事的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中将其设置为变量可能是将其持久化到错误视图中的最简单方法