ASP.Net MVC adresses URL héritées du routage transmettant des ID de chaîne de requête aux actions du contrôleur

StackOverflow https://stackoverflow.com/questions/817325

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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top