2010-07-29 7 views
1

Je travaille avec ASP.NET MVC 2 et je souhaite optimiser mon routage. Le résultat souhaité est la suivante:Mappage d'itinéraires compatible avec le contenu dans ASP.NET MVC 2

http://www.url.com/Sites/ 
http://www.url.com/Sites/Search/NY001 
http://www.url.com/Sites/NY001 
http://www.url.com/Sites/NY001/Photos 

Le problème avec ce scénario est que je veux traiter les bits d'URL différemment en fonction de leur contenu, dans un sens. Comme on peut l'imaginer, "NY001" est l'identifiant d'un site spécifique , pas pour une action qui se trouve dans le contrôleur Sites. Ma solution actuelle consiste à définir une carte d'itinéraire spéciale pour les URL spécifiques au site et à spécifier chaque action séparément dans le contrôleur Sites avant cela.

// currently in place, works 
routes.MapRoute("SiteList", "Sites", new { controller = "Sites", action = "Index" }); 
routes.MapRoute("SiteSearch", "Sites/Search/{searchString}", new { controller = "Sites", action = "Index", searchString = "" }); 
routes.MapRoute("SiteNotFound", "Sites/NotFound", new { controller = "Sites", action = "NotFound" }); 
// and so on... 

routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index", siteId = "" }); 

Comme cela est l'un des éléments centraux de mon application Web, ces actions sont de plus en plus par jour et la liste devient un peu difficile à manier. J'aimerais pouvoir distiller la longue liste des itinéraires spécifiques d'action à une seule déclaration, semblable à ceci:

routes.MapRoute("Sites", "Sites/{action}/{id}", new { controller = "Sites", action = "Index", id = UrlParameter.Optional }); 

Le problème est que le cadre de routage n'a aucun moyen de faire la différence entre cette nouvelle route et la un site spécifique dans l'exemple ci-dessus; par conséquent, les deux sont des correspondances. Suis-je obligé de déclarer chaque action séparément? Devrais-je envisager d'utiliser une expression régulière pour me différencier en fonction du contenu des URL? Merci d'avance et je m'excuse d'avance si cette question a déjà été posée sous une forme différente.

Répondre

1

Vous ne savez pas exactement ce que vous voulez accomplir. Bien sûr, vous ne pouvez pas vraiment la carte des URL avec des signatures différentes avec une route, mais vous pouvez réduire la liste comme ceci:

routes.MapRoute("Site", "Sites/{siteId}/{action}", new { controller = "Sites", action = "Index" }, new { action = "(?:Index|Photos|News)", siteId = @"[A-Z0-9]+" }); 

pour urls:

http://www.url.com/Sites/NY001 
http://www.url.com/Sites/NY001/Photos 
http://www.url.com/Sites/NY001/News 

Cette route ne la carte à des actions Index , Photos, Nouvelles (et tout ce que vous mettez dans cette expression reg).