web-dev-qa-db-fra.com

ASP.NET MVC 4 Routes - contrôleur / id vs contrôleur / action / id

J'essaie d'ajouter un itinéraire à celui par défaut, afin que les deux URL fonctionnent:

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

Cela fera fonctionner le premier itinéraire:

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

Cependant, la deuxième route ne fonctionnera pas évidemment.

Cela fera fonctionner le deuxième itinéraire, mais interrompra le premier:

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

Comment combiner les deux configurations d'itinéraire pour que les deux URL fonctionnent? Je m'excuse s'il y a déjà une question comme ça sur SO, je n'ai rien trouvé.

17
Arman Bimatov

La clé est de mettre les itinéraires plus spécifiques en premier. Mettez donc la route "Book" en premier. Edit Je suppose que vous avez également besoin d'une contrainte pour autoriser uniquement les nombres à correspondre à la partie "id" de cette route. Fin de la modification

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

Et assurez-vous que le paramètre "id" dans votre action "Détails" est un entier:

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

De cette façon, l'itinéraire "Livres" n'attrapera pas une URL comme /users/create (étant donné que le deuxième paramètre doit être un nombre), il passera donc à la route suivante ("par défaut").

35
McGarnagle