ASP.NET MVC 라우팅 레거시 URL QueryString ID를 컨트롤러 작업에 전달합니다.
-
03-07-2019 - |
문제
우리는 현재 IIS6에서 실행 중이지만 곧 IIS 7으로 이사하기를 바라고 있습니다.
기존 웹 양식 사이트를 ASP.NET MVC로 이동합니다. 우리는 새로운 컨트롤러로 리디렉션 해야하는 몇 가지 레거시 페이지가 있습니다. 나는 흥미로운이 기사를 발견했다.http://blog.eworldui.net/post/2008/04/aspnet-mvc-- legacy-url-routing.aspx
그래서 나는 내 자신의 경로 핸들러를 작성하거나 컨트롤러에서 내 리디렉션을 수행 할 수 있다고 생각합니다. 후자는 약간 냄새가납니다.
그러나 컨트롤러의 show () 메소드로 전달 해야하는 레거시 URL에서 쿼리 문자열 값을 처리하는 방법을 잘 모르겠습니다. 예를 들어:
레거시 URL :
/artists/viewartist.aspx?id=4589
나는 이것을 맵핑하기를 원한다 :
ArtistsController Show Action
실제로 내 쇼 액션은 아티스트 이름을 가져 오므로 레거시 URL에서 /Artists /Madonna에서 사용자가 리디렉션되기를 원합니다.
감사!
해결책
언급 한 기사에 따라 이것들을 달성하기위한 단계입니다.
1-your LegacyHandler는 쿼리 문자열에서 경로 값을 추출해야합니다 (이 경우 아티스트의 ID입니다) 여기에 코드가 있습니다.
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- int 유형의 ID 매개 변수를 수락하는 ViewArtist 액션이있는 아티스트 콘트롤러가있는 노선 에이 두 경로를 추가해야합니다.
routes.Add("Legacy", new LegacyRoute("Artists/ViewArtist.aspx", "Artist", new LegacyRouteHandler()));
routes.MapRoute("Artist", "Artist/ViewArtist/{id}", new
{
controller = "Artist",
action = "ViewArtist",
});
이제 : /artists/viewartist.aspx?id=123과 같은 URL로 이동할 수 있습니다.
그리고 당신은 :/artist/viewartist/123으로 리디렉션됩니다.
다른 팁
나는 머리를 둘 때까지 이것으로 조금 어려움을 겪고 있었다. Perhentian과 같은 컨트롤러 에서이 작업을 수행하는 것은 훨씬 쉬웠습니다. id
그들 안에. 그 이유는 컨트롤러에서 모든 리포지토리와 도메인 객체에 액세스 할 수 있었기 때문입니다. 다른 사람들을 돕기 위해 이것은 내가 한 일입니다.
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
메뉴 항목의 URL 경로와 같은 메뉴 항목과 관련된 정보를 저장 한 객체입니다.
예를 들어이 리디렉션
/product_list.aspx?catid=50
에게
/pc-tillbehor/kylning-flaktar/flaktar/170-mm
주목하십시오 RedirectPermanent
MVC3+입니다. 이전 버전을 사용하는 경우 301을 수동으로 만들어야합니다.