ASP.NET MVC 라우팅 레거시 URL QueryString ID를 컨트롤러 작업에 전달합니다.

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

문제

우리는 현재 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을 수동으로 만들어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top