2012-09-07 16 views
6

Mam aplikację MVC3 z kilkoma trasami. Dwa z nich są zdefiniowane następująco:Url.Action nie daje oczekiwanego wyniku. Niepożądane wartości trasy pozostają

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

Teraz, w moim menu mam dwa linki do tych tras, które są tworzone przy użyciu Url.Action:

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

Teraz, kiedy uruchomić aplikację, wszystko Wydaje się być w porządku, a łącza w menu są wyświetlane jako /System/ i /Carrier/ i jest to oczekiwana wartość.

Jednak, kiedy przejść do na przykład /System/MySystem na stronie internetowej i będzie nadal chcesz łącza punkt do tego samego miejsca, ale teraz one wskazywać /System/MySystem i /Carrier/MySystem.

Próbowałem wiele rzeczy, aby łącze nie używało nazwy od wartości trasy, ale bez skutku. Najdziwniejszy przypadek doświadczyłem kiedy próbowałem to:

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

Teraz link pojawił się jako

/System?name=MySystem 

Czy istnieje dobry sposób, żeby upewnić się, że wartość nazwę od wartości trasa nie ingerować w te linki w jakikolwiek sposób?

Odpowiedz

6

Jak zauważyliście, pomocnicy Url. ponownie korzystają z wcześniej podanych parametrów trasy.

Jako obejście (mam nadzieję, że tam jest bardziej eleganckie rozwiązanie ...) można usunąć wpis name z RouteData.Values w widoku:

Więc zanim dzwoni Url.Action w widoku:

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

Usuń ampułko name z RequestContext:

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

Nadszedł als Ö obejście ale jeśli nieco zmodyfikować swoje trasy z zapewnieniem domyślną wartość null dla segmentu name:

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

Oryginalne rozwiązanie („zerowanie” THE name w Url.Action) będzie również pracować:

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

Miałem nadzieję na coś bardziej eleganckiego, ale przynajmniej to robi. Dzięki. –

Powiązane problemy