ASP.NET MVC Routing Legacy -URLs Übergeben von QueryString -IDs an Controller -Aktionen
-
03-07-2019 - |
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!
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.