2013-08-03 7 views
16

Ich versuche, einen Weg zum Standard eines hinzuzufügen, so dass ich beide Urls haben arbeiten:ASP.NET MVC 4 Routen - Controller/id vs controller/action/id

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

Dies wird die erste Route Arbeit machen:

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

jedoch die zweite ro ute wird offensichtlich nicht funktionieren. Dies wird die zweite Strecke der Arbeit, macht

aber die erste Pause:

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

Wie die beiden Routen Konfigurationen kombinieren, so dass beiden URLs arbeiten? Ich entschuldige mich wenn es so eine Frage auf SO gibt, ich konnte nichts finden.

+0

Sollte Ihre zweite URL "Bücher" anstelle von "Benutzer" enthalten? Sie erwähnen, dass die zweite Route die zweite URL funktioniert, aber die erste URL bricht, aber die zweite URL gilt nicht für die zweite Route, es sei denn, sie stimmt mit dem Muster "books/{id}" überein. – Triynko

Antwort

34

Der Schlüssel ist, spezifischere Routen zuerst zu setzen. Legen Sie also zuerst die Route "Buchen" fest. Edit Ich denke, dass Sie auch eine Beschränkung benötigen, um nur zu erlauben, dass Zahlen dem "ID" -Teil dieser Route entsprechen. Ende bearbeitet

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

und sicherzustellen, dass die "id" Parameter in den "Details" Aktion ist ein int:

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

diese Weise die "Bücher" Route wird keine URL fangen wie /users/create (da der zweite Parameter als eine Zahl angefordert wird), und so wird auf die nächste ("Standard") Route fallen.

+0

Ja, nein - es fällt nicht so durch. Wenn Sie/users/create eingeben, erwartet der Server eine {id} anstelle von "create" und gibt eine "Broken link" Fehlerseite aus. –

+0

@ArmanBimatov mein Fehler. Ich bin rostig. Sie brauchen auch eine Einschränkung in der Route, denke ich. Ich habe meine Antwort oben aktualisiert. http://www.asp.net/mvc/tutorials/controllers-and-routing/creating-a-route-constraint-cs – McGarnagle

+0

Schön, es funktioniert. Ich wusste nie über Einschränkungen beim Definieren von Routing. –