2013-04-18 2 views
1

라우팅을 사용하여 내 ASP.NET MVC 응용 프로그램에서 지역화를 구현하려고합니다.ASP.NET MVC 라우팅. 리소스를 찾을 수 없습니다.

예 : www.example.com/Home/Index - 기본 문화권의 콘텐츠를 표시합니다. www.example.com/en/Home/Index - 영어가 표시됩니다. www.example.com/ru/Home/Index - 러시아어 등등 ... 각 작업에 대한

그래서, 내가 만든 현지화 속성 :

public class LocalizationAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.RouteData.Values["lang"] != null && !String.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString())) 
      { 
       var lang = filterContext.RouteData.Values["lang"].ToString(); 
       Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang); 
       Thread.CurrentThread.CurrentUICulture =    CultureInfo.CreateSpecificCulture(lang); 
      } 
      else 
      { 
       var langHeader = String.Empty; 
       langHeader = filterContext.HttpContext.Request.UserLanguages[0]; 
       Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(langHeader); 
       Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(langHeader); 
      } 

      base.OnActionExecuting(filterContext); 
     } 
    } 

내 컨트롤러의 모든 행동에 그 속성을 추가하고있다.

그리고 등록 경로 :

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
      "Localization", 
      "{lang}/{controller}/{action}/{id}", 
      new { lang = "en-US", controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 

    routes.MapRoute(
      "Default", 
      "{controller}/{action}/{id}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 

} 

탐색 www.example.com/About/Contacts에 잘 작동합니다. 그러나 www.example.com/en/About/Contacts 또는 그와 비슷한 것으로 이동하면 404 error : 리소스를 찾을 수 없습니다. 그래서 문제가 될 수 있습니까?

미리 도움 주셔서 감사합니다.

답변

2

www.example.com/en/About/Contacts으로 이동하면 실제로 기본 경로가 호출됩니다. 이 경우 두 경로가 일치하지만 마지막으로 지정한 경로 (상단에서 까지) 만 호출됩니다. 당신은 그들을 더 구체적으로 확인하기 위해 경로에 제약 조건을 추가해야합니다 연락처

: 약 ID : 작업 도중 : 컨트롤러 : 해당 URL로 이동하면

그래서 기본 경로는 다음을 가정합니다. 또는 "로컬라이제이션"경로를 "기본"경로 아래로 이동할 수 있습니다.이 경우 두 경로가 여전히 일치하지만이 경우 마지막 경로는 "로컬라이제이션"이됩니다.

나중에 비슷한 문제를 해결해야 할 경우 RouteDebugger NuGet 패키지를 사용하는 것이 좋습니다. 어떤 경로가 요청과 일치하는지 실제로 어떤 경로가 어떤 매개 변수와 함께 실행되는지 이해하는 데 도움이됩니다. Phil Haack 블로그 항목 : http://haacked.com/archive/2011/04/12/routedebugger-2.aspx

+0

대단히 감사합니다. RouteDebugger를 설치했는데 다음과 같이 표시됩니다. 컨트롤러 : ko 작업 : 약 ID : 연락처 : 그래서 lang 및 컨트롤러에 제약 조건을 추가합니다. 제약 조건 : new {lang = @ "^ [az] {2} $", controller = @ "^ [a-zA-Z] {3,} $"} 여전히 표시 : 컨트롤러 : ko 작업 : 약 ID : 연락처 : –

+0

"로컬라이제이션"경로에 제약 조건을 추가 한 것은 경로를보다 구체적으로 만들기 때문에 중요하지 않습니다. 일치시키려는 라우트가 실제로 일치한다고 말했지만 라우트에 추가 된 최신 라우트 (맨 아래에 "더 중요한"라우트)이므로 "기본값"이 호출됩니다. 경로의 순서를 바꾸거나 "Default"경로의 Id 매개 변수에 숫자 제약 조건을 추가하여 해당 요청에 대해 기본 경로가 더 이상 일치하지 않게하십시오. – chrisd84

+0

아니요, 아무 것도 없습니다. 그러나 "Localization"경로가 "Default"경로가 표시되는 RouteDebugger의 "All Routes"테이블에도 표시되지 않는 것을 발견했습니다. 그리고 "기본"경로를 삭제해도 아무런 변화가 없습니다. 시간 내 주셔서 감사합니다. –

관련 문제