Frage

Wir laufen derzeit auf IIS6, hoffen aber, bald zu IIS 7 zu ziehen.

Wir verschieben eine vorhandene Web -Formulare -Site auf ASP.NET MVC. Wir haben einige Legacy -Seiten, die wir auf die neuen Controller umleiten müssen. Ich bin auf diesen Artikel gestoßen, der interessant aussah:http://blog.eworldui.net/post/2008/04/aspnet-mvc---Legacy-url-routing.aspx

Ich denke, ich könnte entweder meinen eigenen Routenhandler schreiben oder meine Weiterleitung im Controller durchführen. Letzteres riecht leicht.

Ich bin mir jedoch nicht ganz sicher, wie ich mit den Abfrage -Zeichenfolgenwerten aus den älteren URLs umgehen soll, die ich idealerweise an die Show () -Methode meines Controllers übergeben muss. Zum Beispiel:

Legacy URL:

/Artists/viewartist.aspx?id=4589

Ich möchte, dass dies zugeordnet wird:

ArtistsController Show Action

Eigentlich nimmt meine Show -Action den Künstlernamen an, daher möchte ich

Vielen Dank!

War es hilfreich?

Lösung

Abhängig von dem von Ihnen erwähnten Artikel sind dies die Schritte, um dies zu erreichen:

1-your LegacyHandler muss die Routenwerte aus der Abfragezeichenfolge extrahieren (in diesem Fall ist es die ID des Künstlers). Hier ist der Code dafür:

 public class LegacyHandler:MvcHandler
    {
        private RequestContext requestContext;
        public LegacyHandler(RequestContext requestContext) : base(requestContext)
        {
            this.requestContext = requestContext;
        }

        protected override void ProcessRequest(HttpContextBase httpContext)
        {
            string redirectActionName = ((LegacyRoute) RequestContext.RouteData.Route).RedirectActionName;

            var queryString = requestContext.HttpContext.Request.QueryString;
            foreach (var key in queryString.AllKeys)
            {
                requestContext.RouteData.Values.Add(key, queryString[key]);
            }

            VirtualPathData path = RouteTable.Routes.GetVirtualPath(requestContext, redirectActionName,
                                                                    requestContext.RouteData.Values);
            httpContext.Response.Status = "301 Moved Permanently";
            httpContext.Response.AppendHeader("Location", path.VirtualPath);

        }
    }

2- Sie müssen diese beiden Routen dem Routetable hinzufügen, in dem Sie einen ArtistController mit Viewartist-Aktion haben, die einen ID-Parameter des Int-Typs akzeptieren

    routes.Add("Legacy", new LegacyRoute("Artists/ViewArtist.aspx", "Artist", new LegacyRouteHandler()));

    routes.MapRoute("Artist", "Artist/ViewArtist/{id}", new
        {
         controller = "Artist",
         action = "ViewArtist",
        });

Jetzt können Sie zu einer URL navigieren wie: /artists/viewartist.aspx?id=123

und Sie werden weitergeleitet zu:/künstler/viewartist/123

Andere Tipps

Ich hatte ein bisschen damit zu kämpfen, bis ich meinen Kopf darum bekam. Es war viel einfacher, dies in einem Controller wie Perhentian zu tun, dann direkt in der Routenkonfiguration, zumindest in meiner Situation, da unsere neuen URLs nicht haben id in ihnen. Der Grund dafür ist, dass ich im Controller Zugriff auf alle meine Repositorys und Domänenobjekte hatte. Um anderen zu helfen, ist das, was ich getan habe:

routes.MapRoute(null,
    "product_list.aspx", // Matches legacy product_list.aspx
     new { controller = "Products", action = "Legacy" }
);

public ActionResult Legacy(int catid)
{
    MenuItem menuItem = menu.GetMenuItem(catid);
    return RedirectPermanent(menuItem.Path);
}

menu ist ein Objekt, in dem ich Informationen zu Menüeinträgen gespeichert habe, wie der Pfad, der die URL für den Menüeintrag ist.

Dies leitet zum Beispiel aus

/product_list.aspx?catid=50

zu

/pc-tillbehor/kylning-flaktar/flaktar/170-mm

Beachten Sie, dass RedirectPermanent ist MVC3+. Wenn Sie eine ältere Version verwenden, müssen Sie die 301 manuell erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top