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?
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
.
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 = "" }
);