2009-04-09 10 views
50

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:Routage d'URL ASP.NET MVC avec plusieurs valeurs de route

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 je tente de créer un lien d'action à la troisième voie 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 que l'URL ressemble plus à [site-root]/Details/1/url- limace

Peut-on Je vois où je vais mal?

+2

J'ai toujours eu ce genre de problème et je n'ai jamais trouvé une solution acceptable autre que de coder en dur le contrôleur et les noms d'actions. Conduit à beaucoup de routes. – Will

+0

vous pouvez regarder le routage reposant pour le projet ASP.NET MVC http://stevehodgkiss.com/2009/10/11/restful-routes-for-asp-net-mvc.html Je l'utilise et peut atteindre des URL telles as/blogs/1/posts/2/comments/3 – Paul

Répondre

59

Il utilise la première route entièrement satisfaite. Essayez de mettre votre route SlugsAfterId au-dessus du Default.

En gros, ça va: "Vérifier par défaut, vous avez une action? Oui, vous avez un identifiant?" Oui, utilisez celui-ci et passez tous les autres paramètres dans la chaîne de requête. " En guise de remarque, cela rendra votre route Default redondante car vous fournissez une valeur par défaut pour le paramètre slug.

31

Garry (ci-dessus) est correct. 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 montrant les routes qui sont touchées et quand.

Voici le Blog Post. Et voici le Zip File.

+6

+1 pour le lien vers le débogueur de route - merci –

8

Vous pouvez ajouter une contrainte à vos routes qui contiennent "id" car il 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. Puis 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 = "" } 
);