2013-03-28 2 views
6

ho questo nella parte superiore di ciascuna delle diverse traduzioni delle "Condizioni di utilizzo" pagina:@ Url.Action ottenere Lunghezza = 2 allegata

<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> 

Questa è l'azione che dovrebbe gestire gli scatti:

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(); 
     } 
    } 

e queste sono le mie vie:

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}" 
     ); 
} 

Dal principale (vale a dire, in inglese) pagina termini, il primo (cioè, inglese) Link sembra cor rect:

http://localhost:65391/Terms/ 

Perché l'altro (vale a dire, stranieri) generato URL simile a questa?

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

anche, stranamente, se mi digitare manualmente

http://localhost:65391/Terms/de 

per esempio, e andare alla pagina Termini in tedesco, poi il primo collegamento ipertestuale (vale a dire, di nuovo alla pagina di termini inglesi) sguardi in questo modo:

http://localhost:65391/Terms/de 

Vai qui per vedere il luogo reale:

http://inrix.com/traffic/terms

+0

utilizzo di un solo tag rende la vostra domanda difficile da scoprire. Dovresti taggarlo almeno con il tag vesion MVC. come asp.net-mvc-3 o asp.net-mvc-4 ecc. – nemesv

risposta

10

Si utilizza an overload del Url.Action che tratta il terzo argomento, come i routeValues ​​ oggetto.

da MSDN:

routeValues ​​
Tipo: System.Object
Un oggetto che contiene i parametri per un percorso. I parametri vengono recuperati tramite riflessione tramite esaminando le proprietà dell'oggetto. L'oggetto è in genere creato utilizzando la sintassi di inizializzatore di oggetti.

stringhe Così avete superato "de", "fr" come terzo argomento in modo MVC hanno preso le sue proprietà e reso coppie di valori fondamentali: è qui che il Length=2 è in arrivo, perché la classe string ha una proprietà Length e il valore è 2 per le tue corde.

È possibile risolvere questo facilmente con il passaggio di un oggetto anonimo avvolgere le corde:

<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> 
... 

Note:

  • tuo nome proprietà dell'oggetto annonymous id deve corrispondere il percorso nome del segmento id e il parametro di controllo nome id
  • è necessario il pass estemporaneo new { id = "" } nel caso predefinito altrimenti MVC utilizzerà il già dati i valori del percorso. Questo è ciò che hai visto nel caso http://localhost:65391/Terms/de.Quindi il collegamento inglese è diventato http://localhost:65391/Terms/de perché MVC ha già trovato il valore id nell'URL che era de e lo ha riutilizzato automaticamente.
  • Ultima nota l'ortografia corretta è Magyar e non Maygar
+0

Fantastico! Grazie! (Grazie anche per l'errore di ortografia!) – birdus