ASP.NET MVC ROTEGING URLS LEGADO Passando IDs de Querystring para Ações do Controlador
-
03-07-2019 - |
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!
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.