2010-07-28 5 views
0

J'ai une paire d'itinéraires qui pointent tous les deux vers la même action et, selon les données de route fournies, j'aimerais que l'une des routes soit choisie par-dessus l'autre. Le problème est, le moteur de routage semble ajouter automatiquement des valeurs de route que je lui dis explicitement de ne pas.ASP.NET MVC - Moteur de routage qui ajoute des valeurs inattendues

routes.MapRoute(
"Products_Search_Paged", 
"products/search/page{pageNbr}", 
new { controller = "Products", action = "Search" }, 
new { pageNbr = @"\d+" }, 
new[] { "Web.Components.Controllers" } 
); 

routes.MapRoute(
"Products_Search", 
"products/search", 
new { controller = "Products", action = "Search" }, 
new[] { "Web.Components.Controllers" } 
); 

Note, la seule différence entre les deux voies est l'ajout de /page {} pageNbr dans Products_Search_Paged.

Le problème que je fais l'expérience est que lorsque je visualise la route Products_Search_Paged à /produits/Recherche/page2? Name = foo, par exemple, et je veux créer un lien vers /produits/recherche, si j'appelle Url.Action("Search, "Products", new { pageNbr = "" }) il ignore ma déclaration pageNbr = "" et en créant le lien /products/search? PageNbr = 2. Sinon, si je crée un lien avec Url.Action("Search", "Products", new { pageNbr = 5 }) je me retrouve avec /products/search/page5, comme prévu.

J'ai essayé de réorganiser les itinéraires et de placer Products_Search avant Products_Search_Paged qui semble éliminer le problème? PageNbr = # en dépit d'être ajouté annulant, mais qui a eu l'effet supplémentaire de ce pas le formatage du Products_Search_Paged en tant que /page3 et en produisant plutôt /products/search? PageNbr = 3.

De l'essai, j'ai réalisé jusqu'ici, je ne peux trouver aucune raison pour laquelle la pageNbr valeur itinéraire est jointe en se sa valeur actuelle, même quand je mets explicitement à quelque chose d'autre dans un RouteValueDictionary fourni.

Les deux solutions à ce problème qui viennent à l'esprit sont actuellement soit d'utiliser Url.RouteLink() pour définir explicitement quelle route je veux utiliser, ou pour supprimer manuellement le pageNbr clé des RouteData.DataTokens avant de générer l'URL. Avant de choisir l'une de ces solutions, j'espérais que quelqu'un pourrait être en mesure d'identifier pourquoi mon approche actuelle, apparemment légitime, ne produit pas les résultats escomptés.

Répondre

1

Retournez les déclarations, ajoutez une valeur par défaut de pageNbr à l'URL pageless, puis invoquez-la avec un pageNbr de 1. Cela a également l'avantage que les liens avec pagenbr de 1 seront le lien le plus simple.

+0

Cela semble fonctionner, mais si je vous comprends correctement, je dois toujours appeler pageNbr = 1 pour obtenir la route pageless? –

+0

Oui, vous devez toujours passer pageNbr = 1, au cas où vous vous trouvez sur une URL contenant déjà pageNbr. –

+0

D'accord, cela semble raisonnable. Merci Brad –

0

Le problème semble être votre regex contraignant la valeur de pageNbr - chaîne vide ne correspond pas \d+. Vous l'avez explicitement mis dans le dictionnaire de routage, donc la route qui l'utilise est la meilleure correspondance ...

Je n'ai pas testé les alternatives (actuellement loin de ma boîte de Windows), mais en lui donnant une valeur par défaut de UrlParameter.Optional peut aider. Vous pouvez également essayer de changer la regex en \d*.

+0

Cela a été porté à mon attention par quelqu'un d'autre et j'ai essayé ces deux approches, mais cela ne résout pas vraiment le problème car {pageNbr} n'est pas un paramètre facultatif. Si l'utilisateur essaie de visiter */products/search/page * cela ne devrait pas fonctionner du tout. –