2012-09-07 5 views
6

Ho un'app MVC3 con più percorsi. Due di loro sono definiti in questo modo:Url.Action non fornisce il risultato previsto. I valori del percorso indesiderati rimangono

routes.MapRoute(
    null, 
    "System/{name}", // URL with parameters 
    new { controller = "Systems", action = "Index" } // Parameter defaults 
); 
routes.MapRoute(
    null, 
    "Carrier/{name}", // URL with parameters 
    new { controller = "Carriers", action = "Index" } // Parameter defaults 
); 

Ora, nel mio menù ho due link a questi percorsi che vengono creati utilizzando Url.Action:

Url.Action("Index","Systems") 
Url.Action("Index","Carriers") 

Ora quando avvio l'applicazione, tutto sembra buono, e i collegamenti nel menu mostrano come /System/ e /Carrier/, e questo è il valore atteso.

Tuttavia, quando navigo a per esempio /System/MySystem nella pagina web avrei ancora voglia i link per puntare allo stesso posto, ma ora puntare a /System/MySystem e /Carrier/MySystem.

Ho provato un sacco di cose per impedire al collegamento di utilizzare il nome dal valore del percorso, ma senza risultato. Il caso più strano ho vissuto è stato quando ho provato questo:

Url.Action("Index","Systems", new{name = (string)null}) 

Ora il collegamento si presentò come

/System?name=MySystem 

Ci sono un buon modo qui per fare in modo che il valore del nome dai valori di rotta non lo fa interferire con questi collegamenti in alcun modo?

risposta

6

Come notato gli helper Url. riutilizzano i parametri del percorso precedentemente assegnati.

Per aggirare il problema (spero che ci sia una soluzione più elegante ...) è possibile rimuovere la voce name dal RouteData.Values nella vista:

Quindi, prima di chiamare Url.Action nella vista:

Url.Action("Index","Systems") 
Url.Action("Index","Carriers") 

Rimuovere il pre-riempita name dal RequestContext:

@{ 
    Request.RequestContext.RouteData.Values.Remove("name"); 
} 

E 'als o una soluzione, ma se un po 'di modificare i percorsi di fornire un valore null predefinito per il name segmento:

routes.MapRoute(
    null, 
    "System/{name}", // URL with parameters 
    new { controller = "Systems", action = "Index", name = (string)null } 
); 
routes.MapRoute(
    null, 
    "Carrier/{name}", // URL with parameters 
    new { controller = "Carriers", action = "Index", name = (string)null } 
); 

La soluzione originale ("nulling" il name nella Url.Action) funziona anche:

@Url.Action("Index", "Systems" , new {name = (string)null}) 
+0

Speravo in qualcosa di più elegante, ma almeno questo ha portato a termine il lavoro. Grazie. –

Problemi correlati