Domanda

Attualmente stiamo utilizzando IIS6, ma speriamo di passare presto a IIS 7.

Stiamo trasferendo un sito di moduli Web esistente su ASP.Net MVC. Abbiamo alcune pagine legacy che dobbiamo reindirizzare ai nuovi controller. Mi sono imbattuto in questo articolo che sembrava interessante: http: //blog.eworldui. net / post / 2008/04 / ASPNET-MVC --- Legacy-URL-Routing.aspx

Quindi immagino di poter scrivere il mio gestore di route o fare il mio reindirizzamento nel controller. Quest'ultimo ha un lieve odore.

Tuttavia, non sono del tutto sicuro di come gestire i valori della stringa di query dagli URL legacy che idealmente devo passare al metodo Show () del mio controller. Ad esempio:

URL legacy:

  

/Artists/ViewArtist.aspx?Id=4589

Voglio che sia mappato su:

  

Artisti Mostra azione di controllo

In realtà la mia azione Show prende il nome dell'artista, quindi voglio che l'utente venga reindirizzato dall'URL legacy a / artisti / Madonna

Grazie!

È stato utile?

Soluzione

a seconda dell'articolo che hai citato, questi sono i passaggi per farlo:

1-Your LegacyHandler deve estrarre i valori delle rotte dalla stringa della query (in questo caso è l'id dell'artista) ecco il codice per farlo:

 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- devi aggiungere questi due percorsi alla RouteTable dove hai un ArtistController con azione ViewArtist che accetta un parametro id di tipo int

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

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

Ora puoi passare a un URL come: /Artists/ViewArtist.aspx?id=123

e verrai reindirizzato a: / Artist / ViewArtist / 123

Altri suggerimenti

Stavo lottando un po 'con questo fino a quando non ci ho pensato. È stato molto più facile farlo in un Controller come Perhentian ha fatto direttamente nella configurazione del percorso, almeno nella mia situazione poiché i nostri nuovi URL non hanno id in essi. Il motivo è che nel controller avevo accesso a tutti i miei repository e oggetti di dominio. Per aiutare gli altri questo è quello che ho fatto:

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 è un oggetto in cui sono state memorizzate informazioni relative alle voci di menu, come il percorso che è l'URL della voce di menu.

Questo reindirizza ad esempio

/product_list.aspx?catid=50

a

/ pc-Tillbehör / kylning-flaktar / flaktar / 170-mm

Nota che RedirectPermanent è MVC3 +. Se stai utilizzando una versione precedente, devi creare il 301 manualmente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top