2011-01-18 4 views
1

J'ai ajouté ce routage à mon asax global.asp.net problèmes de routage mvc

routes.MapRoute(
    "News", // Route name 
    "News/{timePeriod}/{categoryName}/{page}", // URL with parameters 
    new { controller = "News", action = "Index", 
     timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 }, 
    new { page = @"^\d{1,3}$" }// Parameter defaults 
); 

routes.MapRoute(
    "News2", // Route name 
    "News/{categoryName}/{page}", // URL with parameters 
    new { controller = "News", action = "Index", 
     timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 }, 
    new { page = @"^\d{1,3}$" }// Parameter defaults 
); 

Le problème est urls comme/Nouvelles/ajouter ne fonctionnera pas (à moins que j'ajouter l'itinéraire spécifique) est-il une meilleure façon sans avoir à spécifier l'action url dans asax mondiale?

+2

BTW, la ligne que vous avez marquée comme paramètre par défaut est contrainte de paramètre. Les paramètres par défaut sont supérieurs d'une ligne. – mlusiak

Répondre

0

Je pense que cela l'attraperait. Mais seulement, si vous ne passez pas d'arguments supplémentaires comme id (parce que, alors c'est très similaire à News2 route).

routes.MapRoute(
"News0", 
"News/{action}", 
new { controller = "News", action = "Index" } 
); 

Aussi, essayez Debugger de routage pour tester l'effet que vous voulez: link

0

Vos deux itinéraires ci-dessus chaque itinéraire vers le contrôleur Nouvelles et cliquez sur l'action « Index ». Si vous n'avez pas de surcharge pour l'action Index qui prendra les paramètres que vous spécifiez, la route ne fonctionnera pas correctement. Par exemple, vous devriez avoir ces deux actions:

public ActionResult Index(TimePeriod timePeriod, string categoryName, int page) {..} 

public ActionResult Index(string categoryName, int page) {..} 

En outre, vous devez supprimer le paramètre par défaut de timeperiod de votre deuxième itinéraire puisque vous ne l'utilisez pas sur la route elle-même:

routes.MapRoute(
       "News2", // Route name 
       "News/{categoryName}/{page}", // URL with parameters 
       new { controller = "News", action = "Index", categoryName = "All", page = 1 }, 
       new { page = @"^\d{1,3}$" }// Parameter defaults 
      ); 

Je recommanderais d'avoir une action pour chaque catégorie au lieu de créer un itinéraire pour chaque catégorie. Vous pouvez simplifier vos itinéraires à ceci:

routes.MapRoute(
       "News", // Route name 
       "News/{action}/{timePeriod}/{page}", // URL with parameters 
       new { controller = "News", action = "Index", timePeriod = TimePeriod.AllTime, categoryName = "All", page = 1 }, 
       new { page = @"^\d{1,3}$" }// Parameter defaults 
      ); 

Ensuite, ayant une action pour chaque catégorie:

public ActionResult All(TimePeriod timePeriod, string categoryName, int page) {..} 

public ActionResult Sports(TimePeriod timePeriod, string categoryName, int page) {..} 

public ActionResult Weather(TimePeriod timePeriod, string categoryName, int page) {..} 

De cette façon, tout ce que vous aurez besoin est une voie.

+0

C'est une bonne solution, mais peut-être que reklas veut avoir des routes différentes, pour rendre ses URL plus agréables. Par exemple, il n'a pas besoin de page pour ajouter des nouvelles, mais il le veut quand il affiche des résultats. – mlusiak

+0

@kMike - Si tel est le cas, il doit simplement rendre ces paramètres facultatifs sur la route et son URL n'aura pas à les contenir. – amurra