2014-04-03 2 views
0

방금 ​​MVC 4에서 5로 업그레이드하고 속성 라우팅을 사용하기 시작했습니다. 완벽하게 작동하며 구현하기 쉽습니다.MVC 특성 라우팅, 이전 URL 리디렉션

그러나 웹 사이트가 몇 달 동안 올라 왔기 때문에 검색 엔진을 비롯하여 웹 사이트 링크가 많이 있습니다. 이전 URL이 작동하지 않아 영구적으로 리디렉션해야합니다. 가장 좋은 방법은 무엇이 될지 모르겠습니다. 나는 route.config에서 라우트를 생성하면 라우팅 애트리뷰트의 백업으로 작동 할 것이라고 생각했다. 하지만 그것은 작동하는 유일한 것 같습니다 (첫 번째 제공).

예 .. 이전 URL :/은행/5 새로운 URL :/superbank/5

속성 경로는 다음과 같습니다

[Route("superbank/{id}")] 

그리고 route.config :

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
routes.LowercaseUrls = true; 

routes.MapMvcAttributeRoutes(); 

routes.MapRoute(
      "BankDetails", 
      "bank/{id}", 
      new { controller = "Home", action = "bank" }, //the action is still called bank, not superbank 
      new { id = @"^\d+$" } 
); 

이 코드를 사용하면 은행/5가 아닌 슈퍼 뱅크/5 만 작동합니다. MapRoute 아래에 MapMvcAttributeRoutes()를 삽입하면 ur ls가 작동하고 프로젝트의 모든 URL이 만들어지고 은행/5를 가리 킵니다.

아이디어가 있으십니까? global.asax 또는 IIS url rewrite를 사용해야합니까? 만합니다 (id 매개 변수) 하나 개의 경로를 리디렉션 할 것을있는 경우

답변

0

좋아. 나는 해결책을 찾았다. 그것은 최고의 것이 아닐지도 모르지만 그것은 작동합니다.

RouteConfig.cs에서 "catchall"경로를 추가했습니다. 지금은 다음과 같습니다

 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
     routes.LowercaseUrls = true; 

     routes.MapMvcAttributeRoutes(); 

     routes.MapRoute(
      "", 
      "{catchall*}", 
      new { controller = "Home", action = "NotFound" } 
     ); 

     routes.MapRoute(
      "BankDetails", 
      "bank/{id}", 
      new { controller = "Home", action = "bank" }, 
      new { id = @"^\d+$" } 
     ); 

가 그때 내 홈 컨트롤러 액션 NOTFOUND을 추가 : 이것은 잘 작동

public ActionResult NotFound() 
    { 
     string url = Request.Url.ToString(); 
     url = url.Replace("/bank/", "/superbank/"); 
     url = url.Replace("old-page-name", "new-page-name"); //Just to demonstrate 

     if (url != Request.Url.ToString()) 
      return RedirectPermanent(url); 
     else 
      return Redirect("404page"); 
    } 

. 너무 일반적인 이름을 대체하지 않도록 조심해야합니다.

0

, 난 그냥 액션 메소드를 생성하고이 리디렉션을 돌볼 것 :

[Route("bank/{id}")] 
public ActionResult Bank(int id) 
{ 
    return RedirectToActionPermanent("superbank", new { id }); 
} 
+0

액션 이름을 바꾸고 싶지는 않지만 route bank/{id}와 (과) superbank/{id}를 사용하여 액션을 만들 수는 없습니다. 그리고 단지 하나의 행동이 아니라 총 30 개 정도입니다 :) – Andreas