Having trouble with a simple MVC route

前端 未结 2 587
谎友^
谎友^ 2021-01-07 00:50

Having some trouble with some routes. I don\'t fully understand the MVC routing system so bear with me.

I\'ve got two controllers, Products and Home (with more to co

相关标签:
2条回答
  • 2021-01-07 01:11

    I think what you might be looking for is something that that the author of the code below has termed a Root Controller. I have used this myself on a couple sites, and it really makes for nice URLS, while not requiring you to create more controllers that you'd like to, or end up with duplicate URLs.

    This route is 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
            );
    

    With this defined elsewhere:

        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
        }
    

    The RootActionContraint alows you to still have other routes, and prevents the RootController actions from hiding any controllers.

    You also need to create a controller called Root. This is not a complete implementation. Read the original article here

    0 讨论(0)
  • 2021-01-07 01:30

    Have you tried:

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

    Products should still be handled by the Default route, while the first one can handle your About route.

    0 讨论(0)
提交回复
热议问题