2009-05-03 4 views
4

현재 IIS6에서 실행 중이지만 곧 IIS 7로 전환하려고합니다.쿼리 문자열 ID를 컨트롤러 동작으로 전달하는 ASP.Net MVC 레거시 URL 라우팅

우리는 기존 웹 양식 사이트를 ASP.Net MVC로 이전하고 있습니다. 새 컨트롤러로 리디렉션해야하는 레거시 페이지가 많이 있습니다. 흥미로운이 기사를 보았습니다. http://blog.eworldui.net/post/2008/04/ASPNET-MVC---Legacy-Url-Routing.aspx

그래서 내 자신의 경로 처리기를 작성하거나 컨트롤러에서 리디렉션 할 수 있다고 생각합니다. 후자는 약간 냄새가 난다.

그러나 컨트롤러의 Show() 메서드에 전달해야하는 레거시 URL에서 쿼리 문자열 값을 처리하는 방법을 잘 모르겠습니다.

기존 URL : 예를 들어

ArtistsController :

/Artists/ViewArtist.aspx?Id=4589

나는이에 매핑 할 액션 표시

/

사실 내보기 작업은 아티스트 이름을 사용, 그래서 사용자가/예술가로 기존 URL에서 리디렉션하고 싶어 마돈나

감사합니다!

이 1 - 당신의 여기 (이 작가의 ID입니다이 경우) 를 쿼리 문자열에서 경로 값을 추출해야합니다 LegacyHandler가있다

:

답변

6

은 당신이 언급 한 기사에 따라 다음이 작업을 수행하는 단계입니다 코드는 그렇게 할 수 있습니다 :

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 액션과 ArtistController이있는 RouteTable에이 두 가지 경로를 추가해야

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

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

이제 같은 URL로 이동할 수 있습니다 :

/Artists/ViewArtist.aspx?id=123

당신이로 리디렉션됩니다 :이와 조금 고투/아티스트/ViewArtist/123

+1

안녕하세요. 고맙습니다. FYI, 새로운 스타일의 URL 301에 redirec을 할 수 있도록 : 아티스트/ ID와 대조적으로 301을 통해 링크를 새 형식으로 리디렉션 한 RedirectLink라는 새로운 ActionResult를 만들었습니다. 감사합니다. – Perhentian

0

내가 머리를 쓸 때까지. 새로운 URL에 id이 없기 때문에 Perhentian과 같은 컨트롤러에서이 작업을 수행하는 것이 훨씬 쉬웠습니다. 적어도 내 상황에서는 라우트 구성에서 직접 변경 한 것입니다. 그 이유는 컨트롤러에서 모든 내 리포지토리 및 도메인 개체에 액세스 할 수 있었기 때문입니다. 다른 사람을 돕기 위해이 내가 무슨 짓을 :

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입니다 경로처럼, 메뉴 항목과 관련된 정보를 저장 한 객체입니다.

RedirectPermanent가 MVC3의 +임을

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

참고 예

/product_list.aspx?catid=50

대에서 리다이렉트. 이전 버전을 사용하는 경우 수동으로 301을 만들어야합니다.