2009-09-10 5 views
1

Actuellement ma structure d'URL est comme ceci:refactoring ma route pour être plus dynamique

www.example.com/honda/ www.example.com/honda/add www.example.com/honda/29343

J'ai un contrôleur nommé HondaController.

Maintenant, je veux refactoriser cela afin que je puisse soutenir plus de constructeurs automobiles. La base de données possède une table qui stocke tous les fabricants que je veux prendre en charge.

Comment puis-je conserver mon URL comme ci-dessus, mais prend désormais en charge:

www.example.com/ford www.example.com/toyota/add~~V~~3rd etc.

Je peux facilement renommer le HondaController à CarController, et juste passer dans la chaîne 'honda' ou 'toyota' et mon contrôleur va fonctionner (il est codé dur à 'honda' en ce moment).

Est-ce possible? Je ne suis pas sûr de savoir comment rendre une route dynamique en fonction de ce que j'ai dans la base de données.

Répondre

0

Ce que je recommande est au lieu d'utiliser:

domain/m/<manufacturer>/<action> 

Où m 'est le contrôleur du fabricant. Cela vous permettra d'utiliser le même contrôleur pour toutes vos extensions et vous épargnera beaucoup de maux de tête à l'avenir, en particulier lors de l'ajout de nouvelles fonctionnalités. L'utilisation d'un contrôleur à une lettre est souvent souhaitable lorsque vous souhaitez conserver votre première variable (dans ce cas) comme premier point d'intérêt.

3

Toute partie de votre itinéraire peut être dynamique pour en faire un paramètre de route. Ainsi, au lieu de "/ honda/{action}", faites:

/{manufacturer}/{action} 

Cela vous donnera un paramètre appelé "fabricant" qui a été passé à votre méthode d'action. Ainsi, votre signature de la méthode d'action pourrait maintenant:

public ActionResult add(string manufacturer) { } 

Il serait à vous de vérifier que le paramètre du fabricant correspond correctement la liste des fabricants dans la base de données - il serait probablement préférable de mettre en cache cette liste pour une plus rapide Chercher.


Mise à jour: Ce que je veux dire par « vous devez prendre les paramètres par défaut » pour la route par défaut est la suivante. Si vous avez:

route.MapRoute("Default", "/{controller}/{action}/{id}", 
       new { id = 1 } // <-- this is the parameter default 
      ); 

alors cette route correspondra à toute URL avec deux segments, ainsi que toute URL avec trois segments. Donc "/ product/add/1" sera traité par cette route, mais il en sera de même "/ product/add". Si vous enlevez la partie "new { id = 1 }", elle ne traitera que les URL ressemblant à "/ product/add/1".

+0

womp, mais cela ne sera-t-il pas en conflit avec la route par défaut? Routes.MapRoute ( "Default", // Nom de la route "{controller}/{action}/{id}", // URL avec les paramètres nouveau {action = "Index", id = ""}/ /Paramètre par défaut ); – mrblah

+0

Ce n'est pas vraiment en conflit, mais cela aurait préséance. Toujours mapper vos itinéraires les plus spécifiques en premier - donc mappez votre route {controller}/{action}/{id} avant/{manufacturer}/{action} /. Cela donne la route par défaut une chance de correspondre à l'URL en premier. Notez également que vous pouvez toujours supprimer la route par défaut si vous ne l'utilisez pas. – womp

+1

Notez que vous devez supprimer les paramètres par défaut;) – womp

1

j'ai fait quelque chose comme ça pour le granit que je voulais avoir un contrôleur matériel, mais une URL comme ceci:

noir/granit/worktops noir/quartz/worktops

etc

Je l'ai fait route:

routes.MapRoute("Quote", "quote/{color}/{surface}/{type}", 
         new {controller = "Quote", action = "surface"}); 

citation d'échange pour voiture, donc u peut avoir:

voiture/honda/accord

votre itinéraire peut alors être

routes.MapRoute("cars", "car/{make}/{model}", 
         new {controller = "Cars", action = "Index"}); 

votre actionResults peut alors ressembler à ceci:

public ActionResult Index(string make, string model) 
    { 
     //logic here to get where make and model 

     return View(); 
    } 

que je pense que le couvre