2009-08-18 11 views
3

J'ai une liste de casse-tête marqués avec des «thèmes» spécifiques. Pensez aux questions sur stackoverflow étiquetées avec certaines catégories.Problème de routage dans Asp.Net Mvc

J'essaie d'obtenir ma configuration de la route pour que cela fonctionne comme ceci:

http://www.wikipediamaze.com/puzzles/themed/Movies http://www.wikipediamaze.com/puzzles/themed/Movies,Another-Theme,And-Yet-Another-One

Mes itinéraires sont configurés comme ceci:

routes.MapRoute(
     "wiki", 
     "wiki/{topic}", 
     new {controller = "game", action = "continue", topic = ""} 
     ); 

    routes.MapRoute(
     "UserDisplay", 
     "{controller}/{id}/{userName}", 
     new {controller = "users", action = "display", userName=""}, 
     new { id = @"\d+" } 
     ); 

    routes.MapRoute(
     "ThemedPuzzles", 
     "puzzles/themed/{themes}", 
     new { controller = "puzzles", action = "ThemedPuzzles", themes = "" } 
     ); 

    routes.MapRoute(
     "Default", // Route name 
     "{controller}/{action}/{id}", // URL with parameters 
     new {controller = "Home", action = "Index", id = ""} // Parameter defaults 
     ); 

Mon contrôleur ressemble à ceci :

public ActionResult ThemedPuzzles(string themes, PuzzleSortType? sortType, int? page, int? pageSize) 
{ 
    //Logic goes here 
} 

Mon lien d'action appel dans les vues ressemble à ceci:

 <ul> 
     <%foreach (var theme in Model.Themes) 
      { %> 
      <li><%=Html.ActionLink(theme, "themed", new {controller = "puzzles", themes = theme})%></li> 
      <% } %> 
     </ul> 

Cependant, le problème que je vais avoir est la suivante:

Les liens qui sont générées apparaissent comme ceci:

http://www.wikipediamaze.com/puzzles/themed?themes=MyThemeNameHere 

Pour ajouter à ce problème le paramètre "Thèmes" sur l'action du contrôleur passe toujours par null. Il ne traduit jamais le paramètre querystring en paramètre d'action du contrôleur. Cependant, si je navigue manuellement

http://www.wikipediamaze.com/puzzles/themed/MyThemeNameHere http://www.wikipediamaze.com/puzzles/themed/MyThemeNameHere,Another-ThemeName

tout fonctionne très bien. Qu'est-ce que je rate?

Merci d'avance!

Répondre

1

Le paramètre actionName (deuxième paramètre) de votre appel à Html.ActionLink ne correspond pas à l'action que vous avez spécifiée dans votre route "ThemedPuzzles".

Très similaire à la suggestion de Phil, essayez:

<%= Html.ActionLink(theme, "ThemedPuzzles", new { controller = "puzzles", themes = theme }) %> 

Ou vous pouvez appeler à la route directement (car il porte le nom) sans avoir besoin de spécifier le contrôleur ou une action (comme ils seront retirés du par défaut de l'itinéraire):

<%= Html.RouteLink(theme, "ThemedPuzzles", new { themes = theme }) %> 
0

Essayez ceci:

<li><%=Html.ActionLink(theme, "themed", new {controller = "puzzles", **action="ThemedPuzzles"** themes = theme})%></li> 

Vous devez préciser l'action parce que vous avez un défaut d'action, mais il n'y a aucun paramètre {action} dans votre URL. La raison de ce comportement est supposer avoir une autre route comme

routes.MapRoute(
     "SpecialThemedPuzzles", 
     "puzzles/special-themed/{themes}", 
     new { controller = "puzzles", action = "SpecialThemedPuzzles", themes = "" } 
     ); 

Comment générer une URL pour cette route? Vous ne seriez pas en mesure de le faire, sauf si nous avions un moyen de distinguer cette route de votre autre itinéraire thématique. Ainsi, dans ce cas, lorsque Routing voit un paramètre dans le dictionnaire par défaut qui n'est pas un paramètre dans l'URL réelle, vous devez spécifier cette valeur pour distinguer les deux routes.

Dans ce cas, vous devez spécifier l'action permettant de distinguer les routes.

+0

C'est toujours pas travail. Dois-je faire cela complètement différent de la façon dont j'essaie? – Micah

0

Dans votre déclaration d'itinéraire, essayez de spécifier chaque paramètre d'entrée dans votre méthode de contrôleur.

routes.MapRoute(  
"ThemedPuzzles",   
"puzzles/themed/{themes}",   
new { controller = "puzzles", action = "ThemedPuzzles", themes = "", sortType = "", page="", pageSize="" }   
); 

Si vous avez par défaut pour le type de tri, le numéro de page et la taille de la page, vous pouvez même les mettre ici si elles ne sont pas inclus, un défaut est transmise.

+0

Il n'est pas nécessaire de fournir chaque paramètre d'entrée dans votre déclaration d'itinéraire. En effet, les paramètres sortType, page et pageSize ont tous une valeur Null, ils ne doivent être spécifiés que si vous souhaitez leur attribuer une valeur par défaut. –

+0

Vous avez raison, mais dans mon expérience personnelle si vous souhaitez que l'URL soit dans la structure de dossiers conviviale plutôt que d'utiliser la chaîne de requête, vous devez définir toutes les parties. C'est comme ça que je l'ai toujours réparé. – Josh