ASP.Net MVC enrutamiento de URL heredadas que pasan identificadores de cadenas de consulta a las acciones del controlador

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

Pregunta

Actualmente estamos ejecutando IIS6, pero esperamos pasar a IIS 7 pronto.

Estamos trasladando un sitio de formularios web existente a ASP.Net MVC. Tenemos bastantes páginas heredadas que necesitamos redirigir a los nuevos controladores. Me encontré con este artículo que parecía interesante: http: //blog.eworldui. net / post / 2008/04 / ASPNET-MVC --- Legacy-Url-Routing.aspx

Así que supongo que podría escribir mi propio controlador de ruta o hacer mi redirección en el controlador. El último huele ligeramente.

Sin embargo, no estoy muy seguro de cómo manejar los valores de la cadena de consulta de las URL heredadas que idealmente necesito pasar al método Show () de mi controlador. Por ejemplo:

URL heredada:

  

/Artists/ViewArtist.aspx?Id=4589

Quiero que esto se asigne a:

  

Acción de ArtistsController Show

En realidad, mi acción Show toma el nombre del artista, por lo que quiero que el usuario sea redirigido desde la URL heredada a / artists / Madonna

¡Gracias!

¿Fue útil?

Solución

dependiendo del artículo que mencionó, estos son los pasos para lograr esto:

1-Su LegacyHandler debe extraer los valores de las rutas de la cadena de consulta (en este caso, es la identificación del artista) Aquí está el código para hacer eso:

 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- tienes que agregar estas dos rutas a la RouteTable en la que tienes un ArtistController con la acción ViewArtist que acepta un parámetro id de tipo int

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

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

Ahora puedes navegar a una URL como: /Artists/ViewArtist.aspx?id=123

y será redirigido a: / Artist / ViewArtist / 123

Otros consejos

Estaba luchando un poco con esto hasta que pude entenderlo. Fue mucho más fácil hacer esto en un Controlador como Perhentian lo hizo directamente en la configuración de ruta, al menos en mi situación, ya que nuestras nuevas URL no tienen id en ellas. La razón es que en el controlador tuve acceso a todos mis repositorios y objetos de dominio. Para ayudar a otros, esto es lo que hice:

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 es un objeto donde he almacenado información relacionada con las entradas del menú, como la Ruta que es la URL de la entrada del menú.

Esto redirige, por ejemplo,

/product_list.aspx?catid=50

a

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

Tenga en cuenta que RedirectPermanent es MVC3 +. Si está utilizando una versión anterior, debe crear el 301 manualmente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top