2012-07-17 7 views
5

Hier ist meine Standardroute:MVC umleiten Route auf Standard

routes.MapRouteLowercase(
       "Default", 
       "{country}/{controller}/{action}/{id}", 
       new { 
        country = "uk", 
        controller = "Home", 
        action = "Index", 
        id = UrlParameter.Optional 
       }, 
       new[] { "Presentation.Controllers" } 
       ); 

Wie wir wissen, wenn jemand www.domain.com/ MVC Routing besucht, wird die Standard-Controller und die Aktion bestimmen, auf dem obigen Weg zur Ausführung basiert, aber die URL bleibt gleich. Gibt es eine eingebaute oder elegante Möglichkeit, eine 301-Weiterleitung von www.domain.com/ zu www.domain.com/uk/{controller}/{action}/ für jede Route durchzuführen, die Standardwerte verwendet?

+0

Sie könnten eine Weiterleitung von Ihrem Standard-Controller, z. index action – codingbiz

Antwort

14

Ich habe einen benutzerdefinierten Route-Handler erstellt, der die Weiterleitung auf Route-Ebene durchführt. Danke an Phil Haack.

Hier ist die komplette Arbeit.

Handler Redirect Route

public class RedirectRouteHandler : IRouteHandler 
{ 
    private string _redirectUrl; 

    public RedirectRouteHandler(string redirectUrl) 
    { 
     _redirectUrl = redirectUrl; 
    } 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     if (_redirectUrl.StartsWith("~/")) 
     { 
      string virtualPath = _redirectUrl.Substring(2); 
      Route route = new Route(virtualPath, null); 
      var vpd = route.GetVirtualPath(requestContext, 
       requestContext.RouteData.Values); 
      if (vpd != null) 
      { 
       _redirectUrl = "~/" + vpd.VirtualPath; 
      } 
     } 

     return new RedirectHandler(_redirectUrl, false); 
    } 
} 

Redirect http-Handler

public class RedirectHandler : IHttpHandler 
{ 
    private readonly string _redirectUrl; 

    public RedirectHandler(string redirectUrl, bool isReusable) 
    { 
     _redirectUrl = redirectUrl; 
     IsReusable = isReusable; 
    } 

    public bool IsReusable { get; private set; } 

    public void ProcessRequest(HttpContext context) 
    { 
     context.Response.Status = "301 Moved Permanently"; 
     context.Response.StatusCode = 301; 
     context.Response.AddHeader("Location", _redirectUrl); 
    } 
} 

Routen Erweiterungen

public static class RouteExtensions 
{ 
    public static void Redirect(this RouteCollection routes, string url, string redirectUrl) 
    { 
     routes.Add(new Route(url, new RedirectRouteHandler(redirectUrl))); 
    } 
} 

Mit all diesen Funktionen kann ich beim Routen von Routen in Global.asax.cs so etwas tun.

routes.Redirect("", "/uk/Home/Index"); 

routes.Redirect("uk", "/uk/Home/Index"); 

routes.Redirect("uk/Home", "/uk/Home/Index"); 

.. other routes 
+0

Sehr gründlich, danke :) – Spikeh

+1

Sollten die routes.Redirect vor allen anderen Routen gehen (; ex MapRoute)? Würde das für altes ASPX-Seitenrouting funktionieren? foo.aspx ->/foo – Seth

6

In meinen Projekten habe ich normalerweise "IndexRedirect" als Standardaktion in meiner Route (deren URL nie sichtbar sein wird), die nur auf die "echte" Indexseite umleitet (deren URL immer sichtbar ist).

Sie können diese Aktion in einer Basisklasse aller Controller-Klassen erstellen.

+0

Das war die beste Lösung! – MEMark

+0

Eine neuartige Idee, ich wünschte, ich hätte selbst daran gedacht! – melodiouscode

Verwandte Themen