2010-12-31 9 views
2

Probleme mit einigen Routen haben. Ich verstehe das MVC-Routing-System nicht vollständig.Probleme mit einer einfachen MVC-Route

Ich habe zwei Controller bekommt, Produkte und Heim (mit mehr zu kommen!).

Ich möchte die Ansichten innerhalb des Heim-Controller haben zugänglich, ohne Heim in der URL eingeben zu müssen. Im Wesentlichen möchte ich www.example.com/home/about in www.example.com/about umwandeln, möchte aber trotzdem das www.example.com/products beibehalten.

Hier ist, was ich bisher habe.

Jetzt je nachdem, welcher zuerst ist, kann ich entweder den einen oder den anderen zum Arbeiten bringen, aber nicht beides.

+0

möchten Sie zwei Arten von URL www.example.com/about und www.example.com/products/index dann sollten oben Routen wie erforderlich funktionieren. Kannst du erwähnen, was Ärger im Detail ist? – swapneel

Antwort

1

Ich denke, was Sie suchen etwas werden könnte, ist die, dass der Autor des Codes unten, um ein Root-Controller genannt hat. Ich habe dies selbst auf ein paar Websites verwendet, und es macht wirklich nette URLs, während Sie nicht mehr Controller erstellen müssen, die Sie gerne hätten, oder mit doppelten URLs enden.

Diese Route ist in Global.asax:

 // Root Controller Based on: ASP.NET MVC root url’s with generic routing Posted by William on Sep 19, 2009 
     // http://www.wduffy.co.uk/blog/aspnet-mvc-root-urls-with-generic-routing/ 
     routes.MapRoute(
      "Root", 
      "{action}/{id}", 
      new { controller = "Root", action = "Index", id = UrlParameter.Optional }, 
      new { IsRootAction = new IsRootActionConstraint() } // Route Constraint 
     ); 

Mit dieser an anderer Stelle definiert:

public class IsRootActionConstraint : IRouteConstraint 
    { 
     private Dictionary<string, Type> _controllers; 

     public IsRootActionConstraint() 
     { 
      _controllers = Assembly 
           .GetCallingAssembly() 
           .GetTypes() 
           .Where(type => type.IsSubclassOf(typeof(Controller))) 
           .ToDictionary(key => key.Name.Replace("Controller", "")); 
     } 

     #region IRouteConstraint Members 

     public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
     { 
      string action=values["action"] as string; 
      // Check for controller names 
      return !_controllers.Keys.Contains(action); 
     } 

     #endregion 
    } 

Die RootActionContraint alows Sie noch andere Wege haben, und verhindert, dass die RootController Aktionen im Controller versteckt .

Sie müssen auch einen Controller namens Root erstellen. Dies ist keine vollständige Implementierung. Read the original article here

+0

Das ist genau das, was ich brauchte. Danke für den tollen Artikel. – Matt

1

Haben Sie versucht:

routes.MapRoute(
"Home_About", 
"About", 
new { controller = "Home", action = "About" }); 

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

Produkte noch von der Standardroute umgegangen werden soll, während der erste Ihre Über Route umgehen kann.

Verwandte Themen