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?

50
demandé sur Ian Oxley 2009-04-09 17:33:46

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.

59
répondu Garry Shutler 2009-04-09 13:36:26

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.

Voici le Blog . Et voici le fichier Zip .

32
répondu MunkiPhD 2010-02-18 05:32:50

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 = "" }
);
8
répondu Chris Pietschmann 2009-06-22 21:17:59