2013-09-07 2 views
0

MVC 응용 프로그램에서 라우팅 옵션을 설정하려고합니다.이 옵션 언어 "폴더"가 최상위 수준에 있습니다.MVC 라우팅에서 접두사 사용

site.com/jp/complexroute 

...

는 가 ... 페이지의 영어 버전은 complexroute

를 사용하여 발견

내가 한 가지 방법을 생각할 수 complexroute

site.com/complexroute 
를 사용하여 볼 수있는 페이지의 일본어 버전이다 RouteConfig.RegisterRoutes에서 전체 경로 매핑 목록을 가져 와서 동일한 두 번째 집합을 만들지 만 알려진 언어 설정만으로 제한되는 언어 매개 변수를 사용하는 것이 좋습니다. 이것은 글쓰기와 유지를위한 두통처럼 들립니다.

사용자 지정 MvcHandler를 작성하고 경로에 연결하는 방법으로 실험했습니다. 이것은 내가 요청의 일부를 추출하고 그것을 RequestContext.RouteData에 넣을 수있게 해줄 것입니다. 그러나 이것이 호출 될 때까지는 경로/컨트롤러가 이미 선택된 것 같습니다.

나는 내가 요청한 요청과 RouteCollection에 대한 조회가 발생하기 전에 URL을 조작하고 RequestContext.RouteData에서 값을 설정할 수있는 경로가 선택되는 사이에 일어나는 것을 원한다고 생각한다.

이것이 가능합니까?

+0

아니요 'RequestContext.RouteData'가 라우팅 이후 또는 라우팅 중에 가능할 때까지 사용할 수 없으므로 제안하는 방법으로 솔루션을 얻을 수 있는지 확인하십시오. 매개 변수가 필요할 때 중간에 선택적 매개 변수가있는 경로를 만드는 쉬운 방법은 없다고 생각합니다. 영어 버전의 경우에도 매개 변수를 항상 쉽게 가질 수 있습니다. – asymptoticFault

답변

0
 routes.MapRoute(
      name: "Default", 
      url: "{lang}/{controller}/{action}/{id}", 
      defaults: new { lang = "en", controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

당신은 RouteData.Values에서 [ "LANG을"] LANG에 액세스 할 수 있습니다

샘플>

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)] 
internal sealed class DoLocalizeAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string cultureName = filterContext.RouteData.Values["lang"].ToString(); 
     SpecificCulture = new CultureInfo(cultureName); 
     Thread.CurrentThread.CurrentCulture = SpecificCulture; 
     Thread.CurrentThread.CurrentUICulture = SpecificCulture; 
    } 

    public CultureInfo SpecificCulture { get; set; } 
} 

한 다음 지역화하려는 각 컨트롤러에이 속성을 적용

샘플>

[DoLocalize] 
public class AccountController : Controller 
+0

고마워,하지만 내 문제는 좋은 컨트롤러/동작/ID 경로 매핑이 작동하지 않는다는 것입니다. 나는 다수의 커스텀 라우트를 가지고 있으며 앞의 랭 param으로 모든 라우트를 복사하지 않고도 해당 라우트를 맵핑 할 수있는 방법을 찾으려고합니다. – Zarigani

관련 문제