web-dev-qa-db-fra.com

Routage d'URL ASP.NET MVC avec plusieurs valeurs de route

J'ai des problèmes avec Html.ActionLink lorsque j'ai un itinéraire qui prend plus d'un paramètre. Par exemple, étant donné les itinéraires suivants définis dans mon fichier Global.asax:

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.mvc/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
);

routes.MapRoute(
    "Tagging",
    "{controller}.mvc/{action}/{tags}",
    new { controller = "Products", action = "Index", tags = "" }
);

routes.MapRoute(
    "SlugsAfterId",
    "{controller}.mvc/{action}/{id}/{slug}",
    new { controller = "Products", action = "Browse", id = "", slug = "" }
);

Les deux premières routes fonctionnent sans problème, mais lorsque j'essaie de créer un lien d'action vers la troisième route en utilisant:

<%= Html.ActionLink(Html.Encode(product.Name), "Details", new { id = product.ProductId, slug = Html.Encode(product.Name) }) %>

Je me retrouve avec une URL comme [site-root]/Détails/1? Slug = url-slug alors que je voudrais que l'URL ressemble plus à [site-root]/Détails/1/url-slug

Quelqu'un peut-il voir où je me trompe?

50
Ian Oxley

Il utilise la première route qui est pleinement satisfaite. Essayez de placer votre route SlugsAfterId au-dessus de celle Default.

Cela signifie essentiellement: "Vérifier la valeur par défaut. Vous avez une action? Oui. Vous avez un identifiant? Oui. Utilisez celui-ci et placez tous les autres paramètres dans la chaîne de requête."

En remarque, cela rendra votre route Default redondante car vous fournissez une valeur par défaut pour le paramètre slug.

60
Garry Shutler

Garry (ci-dessus) a raison. Vous pouvez utiliser le débogueur de route de M. Haack pour MVC. Il peut aider à résoudre les problèmes de routage en vous montrant quels itinéraires sont atteints et quand.

Voici le Blog Post . Et voici le Zip File .

32
MunkiPhD

Vous pouvez ajouter une contrainte à vos itinéraires qui contient "id" car il est vraisemblable que d'accepter uniquement un numéro. De cette façon, le premier itinéraire ne correspondra que lorsque l '"id" est numérique, alors il fera le deuxième itinéraire pour toutes les autres valeurs. Ensuite, placez celui qui inclut le {slug} en haut et tout devrait fonctionner correctement.

routes.MapRoute(
    "SlugsAfterId",
    "{controller}.mvc/{action}/{id}/{slug}",
    new { controller = "Products", action = "Browse", id = "", slug = "" },
    new { id = @"\d+" }
);

routes.MapRoute(
    "Default",                                              // Route name
    "{controller}.mvc/{action}/{id}",                           // URL with parameters
    new { controller = "Home", action = "Index", id = "" },  // Parameter defaults
    new { id = @"\d+" }
);

routes.MapRoute(
    "Tagging",
    "{controller}.mvc/{action}/{tags}",
    new { controller = "Products", action = "Index", tags = "" }
);
8
Chris Pietschmann