ASP.Net MVC adresses URL héritées du routage transmettant des ID de chaîne de requête aux actions du contrôleur
-
03-07-2019 - |
Question
Nous fonctionnons actuellement sur IIS6, mais espérons pouvoir bientôt migrer vers IIS 7.
Nous transférons un site de formulaires Web existant vers ASP.Net MVC. Nous avons plusieurs pages héritées que nous devons rediriger vers les nouveaux contrôleurs. Je suis tombé sur cet article qui avait l'air intéressant: http: //blog.eworldui. net / post / 2008/04 / ASPNET-MVC --- Legacy-Url-Routing.aspx
Donc, je suppose que je pourrais écrire mon propre gestionnaire d’itinéraires ou faire ma redirection dans le contrôleur. Ce dernier sent légèrement.
Cependant, je ne suis pas tout à fait sûr de savoir comment gérer les valeurs de la chaîne de requête à partir des adresses URL héritées qu'il convient idéalement de transmettre à la méthode Show () de mon contrôleur. Par exemple:
URL héritée:
/Artists/ViewArtist.aspx?Id=4589
Je souhaite mapper cette information sur:
Action ArtistsController Afficher
En réalité, mon action Show prend le nom de l'artiste. Je souhaite donc que l'utilisateur soit redirigé de l'URL Legacy vers / artists / Madonna
Merci!
La solution
en fonction de l'article que vous avez mentionné, voici les étapes à suivre:
1-Votre LegacyHandler doit extraire les valeurs des itinéraires de la chaîne de requête (dans ce cas, il s'agit de l'identifiant de l'artiste) voici le code pour le faire:
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- vous devez ajouter ces deux routes à la RouteTable où vous avez une action ArtistController with ViewArtist qui accepte un paramètre id de type int
routes.Add("Legacy", new LegacyRoute("Artists/ViewArtist.aspx", "Artist", new LegacyRouteHandler()));
routes.MapRoute("Artist", "Artist/ViewArtist/{id}", new
{
controller = "Artist",
action = "ViewArtist",
});
Vous pouvez maintenant accéder à une URL telle que: /Artists/ViewArtist.aspx?id=123
et vous serez redirigé vers: / Artist / ViewArtist / 123
Autres conseils
Je me débattais un peu avec ça jusqu'à ce que je comprenne bien. Il était beaucoup plus facile de faire cela dans un contrôleur comme Perhentian l’a ensuite fait directement dans la configuration de la route, du moins dans mon cas puisque nos nouvelles URL ne contiennent pas id
. La raison en est que dans le contrôleur, j'avais accès à tous mes référentiels et objets de domaine. Pour aider les autres, voici ce que j'ai fait:
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
est un objet dans lequel j'ai stocké des informations relatives aux entrées de menu, comme le chemin qui correspond à l'URL de l'entrée de menu.
Ceci redirige par exemple
/product_list.aspx?catid=50
à
/ pc-tillbehor / kylning-flaktar / flaktar / 170-mm
Notez que RedirectPermanent
est MVC3 +. Si vous utilisez une version plus ancienne, vous devez créer le 301 manuellement.