2016-06-03 3 views
1

Ich versuche, die HTTP-Fehler in einer MVC5 Website auf diese Weise zu behandeln:ASP.NET MVC 5 - Wie kann ich die Route in httpErrors ändern?

web.config:

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="Replace"> 
     <clear/> 
     <error statusCode="403" path="/language/Error/Details/403" responseMode="ExecuteURL"/> 
     <error statusCode="404" path="/language/Error/Details/404" responseMode="ExecuteURL"/> 
     <error statusCode="500" path="/language/Error/Details/500" responseMode="ExecuteURL"/> 
    </httpErrors> 
</system.webServer> 

ErrorController.cs:

// GET: Error/Details 
public ActionResult Details() 
{ 
    /* Setting the language for the errors since it is not possible to handle multi-language errors in the web.config file where the errors are redirected */ 
    if (!CultureHelper.cultures.Contains(base.culture)) 
    { 
     RouteData.Values["culture"] = CultureHelper.GetCurrentNeutralCulture(); 
    } 

    /* Redirecting uncontrolled errors to 404 error */ 
    if (RouteData.Values["statusCode"] == null) 
    { 
     return RedirectToRoute(new { culture = base.culture, controller = "Error", action = "Details", statusCode = 404 }); 
    } 

    /* Preparing the model */ 
    ErrorViewModel error = ErrorFactory.Create(Convert.ToInt32(RouteData.Values["statusCode"])); 


    /* Preparing the view */ 
    base.SetLanguageFromRoute(); 

    return View(error); 
} 

RouteConfig.cs:

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     name: "Default", 
     url: "{culture}/{controller}/{action}/{id}", 
     defaults: new { culture = CultureHelper.GetCurrentNeutralCulture(), controller = "User", action = "Home", id = UrlParameter.Optional } 
    ); 

    routes.MapRoute(
     name: null, 
     url: "{culture}/Error/Details/{statusCode}", 
     defaults: new { culture = CultureHelper.GetCurrentNeutralCulture() } 
    ); 
} 

Mein Problem ist, wenn die Details GET Aktion aufgerufen wird, sobald es erreicht es diese Zeile:

if (RouteData.Values["statusCode"] == null) 

Es ist immer true zurück, weil es in RouteData keine „status“ Schlüssel ist, da es die Standardroute anstelle der Fehlerroute verwendet wird, und die statusCode wird in der Route mit dem Namen „id übergeben "(Standard-Routenschlüssel)

Ich weiß, ich könnte einfach die Standardroute verwenden und den Statuscode von der ID abfangen, aber ich habe diese benutzerdefinierte Route, wenn ich einen RedirectToRoute zu einem Fehler von anderen Controllern mache, also möchte ich es hier verwenden. Gibt es eine Möglichkeit zu sagen, <httpErrors>, dass ich eine andere Route als die Standardroute verwenden möchte?

Antwort

-1

Gibt es eine Möglichkeit zu sagen, dass ich eine andere Route als die Standardroute verwenden möchte?

Ja. Es gibt 2 Möglichkeiten.

Der sinnvollste Weg ist put specific routes before general routes, so dass Sie in Ihrer Routentabelle keine unerreichbaren Ausführungspfade haben. Dadurch wird sichergestellt, dass Ihre eingehenden URLs an den richtigen Controller weitergeleitet werden.

Das bedeutet, Sie müssen die spezifischere benutzerdefinierte Route vor Ihre Standardroute, so wird es zuerst überprüft werden.

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "Error", 
      url: "{culture}/Error/Details/{statusCode}", 
      defaults: new { culture = CultureHelper.GetCurrentNeutralCulture() } 
     ); 

     routes.MapRoute(
      name: "Default", 
      url: "{culture}/{controller}/{action}/{id}", 
      defaults: new { culture = CultureHelper.GetCurrentNeutralCulture(), controller = "User", action = "Home", id = UrlParameter.Optional } 
     ); 
    } 

Der andere Weg ist, den Routennamen angeben, wenn RedirectToRouteResult aufrufen. Beachten Sie, dass Sie Ihrer Route keinen Namen gegeben haben (es ist null), also gibt es keine Möglichkeit für Sie, dies zu tun, es sei denn, Sie nennen es wie oben.

return RedirectToRoute(
    routeName: "Error", 
    routeValues: new { culture = base.culture, controller = "Error", action = "Details", statusCode = 404 }); 

Dadurch werden Sie auf die korrekte URL umleiten, aber wahrscheinlich immer noch nicht funktionieren, weil, wenn die URL noch zugegriffen wird, wird Ihre „Standard“ Route treffen, da sie diese URL übereinstimmt und erst registriert ist.