ASP.NET routage D'URL MVC avec plusieurs valeurs D'itinéraire
J'ai des problèmes avec Html.ActionLink quand j'ai une route qui prend plus d'un paramètre. Par exemple, étant donné les routes suivantes définies dans mon Global.fichier 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 quand 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] / Details / 1?slug=url-slug alors que je voudrais l'URL à être plus comme [racine du site]/Détails/1/url-slug
Peut quelqu'un voit où je vais mal?
3 réponses
Il utilise la première route qui est entièrement satisfaite. Essayez de placer votre route SlugsAfterId
Au-dessus de celle Default
.
Il va essentiellement: "vérifier par défaut. Eu une action? Oui. Eu une id? Oui. Utilisez celui-ci et chuck tous les autres paramètres dans la chaîne de requête."
En note de côté, cela rendra votre route Default
redondante car vous fournissez une valeur par défaut pour le paramètre slug
.
Garry (ci-dessus) est correct. 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 quelles routes sont touchées et quand.
Vous pouvez ajouter une contrainte à vos Routes qui contiennent " id " car c'est probablement seulement pour accepter un nombre. De cette façon, la première route ne correspondra que lorsque le "id" est numérique, alors il ferait la deuxième route 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 = "" }
);