2010-02-23 8 views
1

Demander la meilleure façon de résoudre ce problème:URL nom du paramètre de routage, l'ordre

dans mon contrôleur je l'action suivante

public ActionResult Member(string id){return View();} 

une autre action dans le même contrôleur

public ActionResult Archive(string year){return View();} 

dans mon global.asax

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

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

si j'appelle cette URL mysite.com/archive/2009 cela fonctionne car l'action attend un paramètre avec un nom "année" et le premier schéma d'itinéraire fonctionne avec cette requête. Mais si j'appelle cette URL mysite.com/member/john il en résultera cette URL mysite.com/member?id=john Donc il semble que ma première route dans global.asax ait la même construction mais un nom de paramètre différent, celui avec le bon nom de paramètre aura la bonne url (mysite.com/archive/2009) mais pour l'autre non. Comment puis-je résoudre ce problème? Je peux changer la table de routage pour m'attendre à un nom de paramètre générique comme "param", mais je dois aussi changer toute la signature de l'action en "param" et ce n'est pas très descriptif (param au lieu de l'année).

Répondre

0

Essayez ceci:

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

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

Vous êtes autorisé à utiliser littéraux dans le second paramètre, et ils agissent comme des filtres. Plus votre itinéraire est spécifique, plus vous devez le placer en haut de la configuration de la route, le système de routage choisira la première route correspondante.

Voici un link pour plus d'informations de fond détaillées. Une partie de la syntaxe a changé depuis que l'article a été écrit mais les règles de base semblent à jour.

+0

encore une fois c'est confus, je voudrais utiliser ID pour membre non année. – dritterweg

+0

Désolé, à ce sujet, a fait une modification. Le point principal est que vous devez spécifier cette action dans la route, afin que la classe de routage puisse identifier la route à utiliser. En outre, il utilise la première route qui correspond, de sorte que vous devez d'abord mettre l'itinéraire plus spécifique. –