2010-09-02 6 views
2

Faisant suite à cette question:Comment configurer le routage ASP.NET MVC pour masquer le nom du contrôleur sur une page d'accueil?

ASP.NET MVC Routing with Default Controller

J'ai une exigence similaire où mon utilisateur final ne veut pas voir le nom du contrôleur dans l'URL pour l'atterrissage ou « page d'accueil » pour leur application.

J'ai un contrôleur appelé DeviceController que je veux être le contrôleur "page d'accueil". Ce contrôleur a un certain nombre d'actions et je voudrais utiliser les URL comme ce qui suit:

 
http://example.com -> calls Index() 
http://example.com/showdevice/1234 -> calls ShowDevice(int id) 
http://example.com/showhistory/1224 -> calls ShowHistory(int id) 

J'ai besoin également des liens générés pour ce contrôleur de quitter la /device partie de l'URL.

J'ai aussi un certain nombre d'autres contrôleurs, par exemple BuildController:

 
http://example.com/build 
http://example.com/build/status/1234 
http://example.com/build/restart/1234 

et ainsi de suite. Les URL de ces contrôleurs sont bien comme ils sont. Le problème est que je n'arrive tout simplement pas à comprendre le routage, même après avoir étudié les réponses à la question mentionnée ci-dessus.

Quelqu'un peut-il fournir un exemple de code expliquant comment procéder? J'utilise ASP.NET MVC2.

Répondre

6

Essayez ceci:

private void RegisterRoutes(RouteCollection routes) { 

     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute("default", "{controller}/{action}/{id}", 
     new { action = "index", id = "" }, 
     // Register below the name of all the other controllers 
     new { controller = @"^(account|support)$" }); 

     routes.MapRoute("home", "{action}", 
     new { controller = "device", action = "index" }); 
    } 

par exemple/foo

Si foo n'est pas un contrôleur, il est traité comme une action du contrôleur device.

+0

Merci Max, cela fait l'affaire. – Kev

+0

Y at-il un moyen de le faire sans avoir à lister manuellement tous les autres contrôleurs dans la regex? –

0

Étape 1: Créez la contrainte de routage.

public class RootRouteConstraint<T> : IRouteConstraint 
{ 
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     var rootMethodNames = typeof(T).GetMethods().Select(x => x.Name.ToLower()); 
     return rootMethodNames.Contains(values["action"].ToString().ToLower()); 
    } 
} 

Étape 2:
Ajouter un nouveau mappage d'itinéraire au-dessus de votre mappage par défaut qui utilise la contrainte de route que nous venons de créer. Le paramètre générique doit être la classe de contrôleur que vous prévoyez d'utiliser comme contrôleur "racine".

routes.MapRoute(
       "Root", 
       "{action}", 
       new {controller = "Home", action = "Index", id = UrlParameter.Optional}, 
       new {isMethodInHomeController = new RootRouteConstraint<HomeController>()} 
       ); 


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

Maintenant, vous devriez être en mesure d'accéder à vos méthodes de contrôleur de la maison comme ceci: example.com/about, example.com/contact

Ce sera affecte uniquement l'url de HomeController. Tous les autres contrôleurs auront la fonctionnalité de routage par défaut.

+0

Bonjour, Comment rediriger domain.com/Home/About vers domain.com/About sans affecter aucun autre contrôleur. –

+0

Comme je l'ai expliqué ci-dessus, ajoutez le code ci-dessus à votre projet. Il répondra à vos besoins. – Rahul

Questions connexes