Pergunta

No momento, estamos executando no IIS6, mas na esperança de mudar para o IIS 7 em breve.

Estamos movendo um site de formulários da Web existente para o ASP.NET MVC. Temos muitas páginas herdadas que precisamos redirecionar para os novos controladores. Eu me deparei com este artigo que parecia interessante:http://blog.eworldui.net/post/2008/04/aspnet-mvc--legacy-url-ruting.aspx

Então, acho que poderia escrever meu próprio manipulador de rota ou fazer meu redirecionamento no controlador. O último cheira um pouco.

No entanto, não tenho muita certeza de como lidar com os valores de string de consulta dos URLs herdados que, idealmente, preciso passar para o método Show () do meu controlador. Por exemplo:

URL legado:

/Artists/Viewartist.aspx?id=4589

Eu quero que isso mapeie para:

ArtistsController Show Action

Na verdade, minha ação do programa leva o nome do artista, então eu quero que o usuário seja redirecionado do URL legado para /artistas /Madonna

Obrigado!

Foi útil?

Solução

Dependendo do artigo que você mencionou, essas são as etapas para realizar isso:

1-Your LegacyHandler deve extrair os valores das rotas da sequência de consultas (neste caso, é o ID do artista). Aqui está o código para fazer isso:

 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- Você deve adicionar essas duas rotas ao roteiro onde você tem um artista Controller com ação ViewArtist que aceita um parâmetro de identificação do tipo int tipo

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

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

Agora você pode navegar para um URL como: /artists/Viewartist.aspx?id=123

E você será redirecionado para:/artist/viewartist/123

Outras dicas

Eu estava lutando um pouco com isso até ficar com a cabeça. Foi muito mais fácil fazer isso em um controlador como o Perhentian fez então diretamente na configuração da rota, pelo menos na minha situação, já que nossos novos URLs não têm id neles. O motivo é que, no controlador, tive acesso a todos os meus repositórios e objetos de domínio. Para ajudar os outros, isso é o que eu fiz:

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 é um objeto em que eu armazenei informações relacionadas às entradas do menu, como o caminho que é o URL para a entrada do menu.

Isso redireciona de por exemplo

/product_list.aspx?catid=50

para

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

Observe que RedirectPermanent é mvc3+. Se você estiver usando uma versão mais antiga, precisará criar o 301 manualmente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top