2013-03-28 10 views
6

mam to w górnej części każdej z kilku przekładów „Warunki użytkowania” stronie:@ Url.Action coraz Długość = 2 dołączany

<li><a href="@Url.Action("Index", "Terms")">English</a></li> 
<li><a href="@Url.Action("Index", "Terms", "de")">Deutsch</a></li> 
<li><a href="@Url.Action("Index", "Terms", "fr")">Français</a></li> 
<li><a href="@Url.Action("Index", "Terms", "it")">Italiano</a></li> 
<li><a href="@Url.Action("Index", "Terms", "nl")">Nederlands</a></li> 
<li><a href="@Url.Action("Index", "Terms", "hu")">Maygar</a></li> 
<li><a href="@Url.Action("Index", "Terms", "es")">Español</a></li> 
<li><a href="@Url.Action("Index", "Terms", "zh")">简体中文</a></li> 
<li><a href="@Url.Action("Index", "Terms", "pt-pt")">European Português</a></li> 
<li><a href="@Url.Action("Index", "Terms", "pt")">Português</a></li> 

Jest to działanie, które ma obsługiwać kliknięcia:

public class TermsController : Controller 
{ 
    public ActionResult Index(string id) 
    { 
     switch (id) 
     { 
      case "de": 
       return View("de"); 
      case "fr": 
       return View("fr"); 
      case "it": 
       return View("it"); 
      case "nl": 
       return View("nl"); 
      case "hu": 
       return View("hu"); 
      case "es": 
       return View("es"); 
      case "zh": 
       return View("zh"); 
      case "pt": 
       return View("pt"); 
      case "pt-pt": 
       return View("pt-pt"); 
      default: 
       return View(); 
     } 
    } 

i to są moje trasy:

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

    routes.MapRoute(
     "Terms", 
     "{controller}/{id}", 
     new { controller = "Terms", action = "Index" } 
     ); 

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

    routes.MapRoute(
     "ThankYou", 
     "{controller}/{action}/{email}/{id}" 
     ); 
} 

od głównej (czyli angielski) strona Warunki, pierwszy (czyli angielski) Opinie wygląda cor rect:

http://localhost:65391/Terms/ 

Dlaczego inne (tj. obce) wygenerowane adresy URL wyglądają tak?

http://localhost:65391/Terms/?Length=2 

Również dziwne, gdybym ręcznie wpisać

http://localhost:65391/Terms/de 

na przykład, i przejdź do strony Warunki w języku niemieckim, to pierwszy hiperłącze (czyli powrót do strony Angielsko) Zestawy tak:

http://localhost:65391/Terms/de 

Go tutaj, aby zobaczyć rzeczywistą stronę:

http://inrix.com/traffic/terms

+0

Stosując tylko jeden tag sprawia, że ​​pytanie trudne do odkrycia. Powinieneś oznaczyć go co najmniej dodatkowym znacznikiem VV MVC. jak asp.net-mvc-3 lub asp.net-mvc-4 itp. – nemesv

Odpowiedz

10

Używasz an overload z Url.Action, który traktuje trzeci argument jako obiekt routeValues ​​.

Od MSDN:

routeValues ​​
Typ: System.Object
Obiekt, który zawiera parametry dla trasy. Parametry są pobierane przez odbicie , badając właściwości obiektu. Obiekt jest zwykle utworzony przy użyciu składni inicjatora obiektu.

Więc zdałeś ciągi "de", "fr" jako trzeci argument tak MVC miały swoje właściwości i wykonane pary wartość klucza: to gdzie Length=2 nadchodzi, ponieważ klasa string ma jedną właściwość Length i wartość wynosi 2 do twoje struny.

Można to naprawić łatwo przechodząc anonimowy obiekt owijając swoje struny:

<li><a href="@Url.Action("Index", "Terms" new { id = "" })">English</a></li> 
<li><a href="@Url.Action("Index", "Terms", new { id = "de" })">Deutsch</a></li> 
<li><a href="@Url.Action("Index", "Terms", new { id = "fr" })">Français</a></li> 
... 

Uwagi:

  • Twój annonymous Obiekt Nazwa obiektu id należy dopasować swoje imię odcinek trasy id i parametr kontroler nazwę id
  • musisz domyślnie podać new { id = "" } w domyślnym przypadku, w przeciwnym razie MVC użyje już podane wartości trasy. To właśnie widzieliście w przypadku http://localhost:65391/Terms/de.Więc link w języku angielskim stał się http://localhost:65391/Terms/de, ponieważ MVC znalazł już wartość id w adresie URL, który był de i automatycznie ponownie go wykorzystał.
  • ostatnia uwaga jest poprawna pisownia Magyar i nie Maygar
+0

Fantastyczne! Dziękuję Ci! (Dzięki za błędy w pisowni!) – birdus