2009-06-29 7 views
6

Je pensais que ce serait assez facile, mais je suis totalement déconcerté. Je veux que les vues d'un contrôleur soient au niveau racine de l'application, plutôt que dans un sous-répertoire pour ce contrôleur, mais je ne peux pas le comprendre.ASP.NET MVC Routing Root Level Views

Je voudrais avoir ces deux urls:

/Info - Cette action devrait "Info" sur le contrôleur "Home"

/Administration/- Ce devrait être l'action "Index" (par défaut) sur le contrôleur "Admin"

Jusqu'à présent, peu importe ce que j'ai essayé, la première route finira par attraper les deux. Je n'arrive pas à séparer les deux.

Cette page d'informations n'a même pas besoin d'un contrôleur, c'est statique, mais je veux utiliser une page maître. Il y a peut-être un moyen beaucoup plus facile de le faire, mais je ne l'ai pas compris non plus. Tout ce que je peux penser à cela fonctionnerait, serait de créer un contrôleur d'informations, et de déplacer Views/Home/Info à Views/Info/Index, mais cela a une certaine odeur.

j'ai pu le faire en utilisant des rails:

map.connect ':controller/:action/:id' 
    map.connect ':action', :controller => 'home' 

Répondre

6

Vous avez juste besoin des itinéraires appropriés. Dans votre cas:

routes.MapRoute(
       "Info", 
       "Info", 
       new { controller = "Home", action = "Info" } 

routes.MapRoute(
       "Admin", 
       "Admin", 
       new { controller = "Admin", action = "Index" } 

Mais je vous recommande l'approche this.

Si vous devez modifier l'emplacement physique par défaut des vues/vues partielles,
consultez how to créer des moteurs de vue personnalisés.

+0

N'a pas pensé à les acheminer statiquement, façon de raccrocher à la recherche du motif! Il semble toujours qu'il devrait y avoir une manière plus dynamique, donc je n'ai pas besoin d'ajouter une nouvelle route pour chaque page. –

+0

Je pensais la même chose, mais je ne suis plus si optimiste. Quoi qu'il en soit - le routage à travers les attributs ressemble à une balle d'argent pour moi. :) –

+0

Presque comme s'il y avait un slash implicite donc à la fin "/ Info" et "/ Admin /" finissent par atteindre la même route car "/ Info" est traité comme "/ Info /". Et vice-versa; si je re-commande les routes, la première route les attrape toutes les deux. Dans ce cas, c'est comme si l'on traitait "/ Admin /" comme "/ Admin". Je vérifie le routage basé sur l'attribut. Vraiment prometteur. –

0

Vous pouvez utiliser les attributs Route.

Dans votre fichier de configuration de route, vous devriez avoir.

 routes.MapMvcAttributeRoutes(); 
     AreaRegistration.RegisterAllAreas(); 
     //code below should already be in your route config by default 
     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 

Ensuite, au-dessus de chaque action, vous pouvez avoir un attribut route.

[Route("info")] 

Vous pouvez même obtenir plus avancé avec ces attributs en ajoutant des paramètres, et/ou sous-dossiers

[Route("blog/posts/{postId}")] 

Vous pouvez mettre l'attribut ci-dessus sur toute action, et il apparaîtra comme si elle est originaire de le contrôleur de blog. Cependant, vous n'avez même pas besoin d'un contrôleur de blog. De plus, les {} signifient le paramètre, donc assurez-vous que votre action prend le même paramètre que ce qui est dans les accolades. Dans ce cas, le paramètre serait

string postId