50 votes

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

J'ai du mal avec le Html.ActionLink quand j'ai un parcours qui prend plus d'un paramètre. Par exemple, étant donné les itinéraires suivants définis dans mon Global.asax fichier:

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 premiers itinéraires de travail sans problème, mais lorsque j'essaie de créer un lien d'action à la troisième route à l'aide de:

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

Je me retrouve avec une URL de la forme [racine du site]/Détails/1?slug=url-limace alors que je voudrais l'URL à être plus comme [racine du site]/Détails/1/url-limace

Quelqu'un peut-il voir où je vais mal?

32voto

MunkiPhD Points 2610

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

Voici le blog . Et voici le fichier Zip .

8voto

Chris Pietschmann Points 13397

Vous pouvez ajouter à vos itinéraires une contrainte qui contient "id" puisqu'il est supposé accepter uniquement un nombre. De cette façon, la première route ne correspondra que si "id" est numérique, elle 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 = "" }
);
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X