2013-08-03 17 views
16

Próbuję dodać trasę do domyślnego, tak że mam oba adresy URL pracy:ASP.NET MVC 4 Trasy - kontroler/id vs kontrolera/akcji/id

  1. http://www.mywebsite.com/users/create
  2. http://www.mywebsite.com/users/1

To sprawi, że pierwsze prace trasach:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "users", action = "Index", id = UrlParameter.Optional } 
); 

jednak drugi ro ute nie działa w sposób oczywisty.

To sprawi drugą pracę trasy, ale złamie pierwszy:

routes.MapRoute(
    name: "Book", 
    url: "books/{id}", 
    defaults: new { controller = "users", action = "Details" } 
); 

Jak połączyć dwie konfiguracje trasy tak, że oba adresy działa? Przepraszam, jeśli jest już takie pytanie na SO, nie byłem w stanie znaleźć niczego.

+0

Czy Twój drugi URL zawiera "książki" zamiast "użytkownicy"? Wspomniałeś, że druga trasa tworzy drugi adres URL, ale zrywa pierwszy, ale drugi adres URL nie ma zastosowania do drugiej trasy, chyba że pasuje do wzorca "books/{id}". – Triynko

Odpowiedz

34

Kluczem jest wprowadzenie bardziej konkretnych tras. Więc najpierw ustaw trasę "Book". Edycja Domyślam się, że potrzebujesz ograniczenia, aby numery były zgodne tylko z częścią "id" tej trasy. Koniec edit

routes.MapRoute(
    name: "Book", 
    url: "books/{id}", 
    defaults: new { controller = "users", action = "Details" }, 
    constraints: new { id = @"\d+" } 
); 

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "users", action = "Index", id = UrlParameter.Optional } 
); 

I upewnić się, że parametr „id” w „Szczegóły” działania jest int:

// "users" controller 
public ActionResult books(int id) 
{ 
    // ... 
} 

ten sposób „Książki” Trasa nie złapie URL podobnego /users/create (ponieważ drugi parametr ma być liczbą), a więc przechodzi do następnej ("Domyślnej") trasy.

+0

Tak, nie - nie spada tak. Kiedy wpisujesz/users/create, serwer spodziewa się {id} zamiast "create", i wyświetla stronę błędu "Broken link". –

+0

@ArmanBimatov mój błąd. Jestem zardzewiały. W takim razie, jak sądzę, potrzebujesz również ograniczenia na trasie. Zaktualizowałem moją odpowiedź powyżej. http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs – McGarnagle

+0

Fajnie, to działa. Nigdy nie wiedziałem o ograniczeniach w definiowaniu routingu. –