3

Je cherche à faire une route très simple dans mon site Web ASP.NET MVC 2.0. J'ai cherché de l'aide mais tous les exemples que je peux trouver sont pour un routage vraiment complexe.Routage dans ASP.NET MVC 2.0

Fondamentalement, je veux toutes les pages de mon contrôleur Home pour résoudre après le domaine par opposition à/Accueil/

Par exemple, je veux http://www.MyWebsite.com/Home/LandingPage/

Pour devenir http://www.MyWebsite.com/LandingPage/

Mais seulement pour la maison contrôleur, je veux que le reste de mes contrôleurs fonctionnent normalement. Je pensais à créer un contrôleur pour chacun et en utilisant simplement un index, mais nous avons besoin de beaucoup de pages de destination pour notre marketing comme ça et cela ferait rapidement charger le site avec des contrôleurs pour une seule page chacun, ce qui est inférieur à idéal.

Répondre

1

Une façon de le faire serait d'avoir un séparé itinéraire pour chaque page de destination. Une autre façon serait d'avoir une seule route avec une contrainte qui correspond à chaque page de destination (et rien d'autre).

routes.MapRoute(
     "LandingPage1" 
     "landingpage1/{id}", 
     new { controller = "home", action = "landingpage", id = UrlParameter.Optional }); 

routes.MapRoute(
     "LandingPage2" 
     "landingpage2/{id}", 
     new { controller = "home", action = "landingpage2", id = UrlParameter.Optional }); 

Notez que vous pourriez probablement le faire avec un peu de réflexion (non testé).

foreach (var method on typeof(HomeController).GetMethods()) 
{ 
     if (method.ReturnType.IsInstanceOf(typeof(ActionResult))) 
     { 
      routes.MapRoute(
       method.Name, 
       method.Name + "/{id}", 
       new { controller = "home", action = method.Name, id = UrlParameter.Optional }); 
     } 
} 

La solution RouteConstraint serait similaire, sauf que vous auriez une seule route avec une contrainte personnalisée qui a évalué si la valeur d'itinéraire appropriée correspond à une des méthodes sur HomeController et, le cas échéant, remplacer le contrôleur et action avec "home" et la valeur correspondante.

routes.MapRoute(
    "LandingPage", 
    "{action}/{id}", 
    new { controller = "home", action = "index", id = UrlParameter.Optional }, 
    new LandingPageRouteConstraint() 
); 


public LandingPageRouteContstraint : IRouteConstraint 
{ 
    public bool Match 
     (
      HttpContextBase httpContext, 
      Route route, 
      string parameterName, 
      RouteValueDictionary values, 
      RouteDirection routeDirection 
     ) 
    { 
     // simplistic, you'd also likely need to check that it has the correct return 
     // type, ... 
     return typeof(HomeController).GetMethod(values.Values["action"]) != null; 
    } 
} 

Notez que le mécanisme de routage par page, même si vous utilisez la réflexion, est effectué une seule fois. A partir de là, vous faites un simple coup d'œil à chaque fois. Le mécanisme RouteConstraint utilisera la réflexion à chaque fois pour voir si l'itinéraire correspond (à moins qu'il ne mette en cache les résultats, ce que je ne pense pas faire).

+0

Parfait, cela aide des tonnes. Merci! –

0

Je pense qu'il vous manque la route par défaut.

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

Ainsi, lorsque vous tapez www.mywebsite.com, le contrôleur, l'action et les paramètres id aurait les valeurs suivantes:

controller : Home  
action: Index  
id : ""