2012-02-19 4 views
1

ASP MVC 3 프로젝트에서 언어 전환을 사용하려고합니다.ActionLink를 사용하여 ASP MVC 3 스위칭 언어

라우팅는 다음과 같이 정의된다 :

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

     routes.MapRoute(
      "DefaultWithLanguage", // Route name 
      "{language}/{controller}/{id}/{slug}", // URL with parameters 
      new { language = "en", controller = "Front", action = "Details", id = UrlParameter.Optional, slug = UrlParameter.Optional } // Parameter defaults     
     ); 

     routes.MapRoute(
      "Default", // Route name 
      "{controller}/{action}/{id}", // URL with parameters 
      new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
     ); 

이 (_Layout.cshtml에서) 언어를 전환하는 시도는 다음과 같이 작동

<li>@Html.ActionLink("Spanish", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { language = "es" })</li>  

대신에 (다음과 같이 URL을 얻기의 가진 후 선택 스페인어)

.../es/ControllerName/ActionName 

은 내가 '이 점점 M :

내가 다음 (알 마지막 널 매개 변수)에 ActionLink 설정하면
.../ControllerName/ActionName?Length=11 

:

.../ControllerName/ActionName?language=es 

내가 무엇을 놓치고 :

<li>@Html.ActionLink("Spanish", ViewContext.RouteData.Values["action"].ToString(), ViewContext.RouteData.Values["controller"].ToString(), new { language = "es" }, null)</li> 

을 나는이 얻을? 미리 감사드립니다.

+0

기본 경로도 그대로 두셨습니까? 모든 경로 등록을 표시하십시오. –

+0

@Darin (변경된) 공식을 살펴보십시오. RegisterRoutes에 모든 코드를 포함 시켰습니다. –

답변

1

경로 등록에 몇 가지 문제가 있습니다. DefaultWithLanguage 경로 등록. {action}을 지정할 수 없습니다. 즉,이 경로는 Details 작업과 일치합니다 (기본값으로 지정했기 때문에). 또 다른 문제는 {id} 매개 변수를 선택 사항으로 설정 한 것입니다. 하지만 그건 불가능합니다. 경로의 마지막 매개 변수 만 선택 사항 일 수 있습니다. 귀하의 경우에는 {slug} 매개 변수가옵니다.

그래서 하나의 가능성은 다음 다음

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

    routes.MapRoute(
     "DefaultWithLanguage", 
     "{language}/{controller}/{action}/{id}", 
     new 
     { 
      language = "en", 
      controller = "Front", 
      action = "Details", 
      id = UrlParameter.Optional 
     } 
    ); 
} 

과 :

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

    routes.MapRoute(
     "DefaultWithLanguage", 
     "{language}/{controller}/{action}/{id}/{slug}", 
     new 
     { 
      language = "en", 
      controller = "Front", 
      action = "Details", 
      slug = UrlParameter.Optional 
     } 
    ); 
} 
:

@Html.ActionLink(
    "Spanish", 
    ViewContext.RouteData.GetRequiredString("action"), 
    ViewContext.RouteData.GetRequiredString("controller"), 
    new { language = "es" }, 
    null 
) 

당신이 다음 {id}가 더 이상 선택 할 수 없습니다 수 {slug} 매개 변수를 추가하고 싶다면

다음 :

@Html.ActionLink(
    "Spanish", 
    ViewContext.RouteData.GetRequiredString("action"), 
    ViewContext.RouteData.GetRequiredString("controller"), 
    new { 
     language = "es", 
     id = ViewContext.RouteData.GetRequiredString("id") 
    }, 
    null 
) 
+0

이제 알겠습니다! 네가 옳아! 설명 주셔서 대단히 감사합니다! –

0

다음은 Darin의 답변입니다.

나는 다음과 같은 경로를 갖고 싶어 :

.../en/ControllerName/Id 
.../en/ControllerName/Id/Slug 
.../en/ControllerName 

이 마지막 경로 문제를 (대린의 대답을 참조)가 발생합니다. 다음

<li>@Html.ActionLink("Deutsch", ViewContext.RouteData.Values["action"].ToString() 
, ViewContext.RouteData.Values["controller"].ToString(), new { language = "de" 
, id = ViewContext.RouteData.Values["id"]!=null ? ViewContext.RouteData.Values["id"].ToString():null }, null)</li> 
    <li>@Html.ActionLink("English", ViewContext.RouteData.Values["action"].ToString() 
, ViewContext.RouteData.Values["controller"].ToString(), new { language = "en" 
, id = ViewContext.RouteData.Values["id"] != null ? ViewContext.RouteData.Values["id"].ToString() : null }, null)</li> 
에 마스터 페이지에서 조정할 수

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

      routes.MapRoute(
       "DefaultWithLanguage", // Route name 
       "{language}/{controller}/{id}/{slug}", // URL with parameters 
       new { language = "en", controller = "Front", action = "Details", id = UrlParameter.Optional, slug = UrlParameter.Optional } // Parameter defaults             
      ); 

      routes.MapRoute(
       "DefaultWithLanguageWithoutId", // Route name 
       "{language}/{controller}", // URL with parameters 
       new { language = "en", controller = "Front", action = "Details"} // Parameter defaults     

      ); 

      routes.MapRoute(
       "Default", // Route name 
       "{controller}/{action}/{id}", // URL with parameters 
       new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults 
      ); 
     } 

이 코드를 일으키는 : 다음은이 경로를 얻고 유지하기 위해 "해킹은"또 다른 경로 (두 번째 이름 DefaultWithLanguageWithoutId)를 정의하는 것입니다

완벽하게 작동합니다!

단 하나의 "단점"은보기에 관련된 일부 코드가 있다는 사실이지만 (보기를 피하기를 좋아했을 것입니다.) 그러나 이것은 매우 간단하므로 가치가 있다고 생각합니다!