Возникли проблемы с простым маршрутом MVC - PullRequest
2 голосов
/ 31 декабря 2010

Возникли проблемы с некоторыми маршрутами. Я не совсем понимаю систему маршрутизации MVC, так что терпите меня.

У меня есть два контроллера: «Продукты» и «Дом» (еще больше!).

Я хочу, чтобы представления внутри контроллера Home были доступны без необходимости вводить Home в URL. По сути, я хочу превратить www.example.com/home/about в www.example.com/about, однако я все еще хочу сохранить www.example.com/products.

.

Вот что у меня есть.

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

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

Теперь, в зависимости от того, кто из них первый, я могу заставить работать одного или другого, но не обоих.

Ответы [ 2 ]

1 голос
/ 05 января 2011

Вы пробовали:

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

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

Продукты по-прежнему должны обрабатываться по маршруту по умолчанию, в то время как первый может обрабатывать ваш маршрут О.

1 голос
/ 05 января 2011

Я думаю, что вы, возможно, ищете то, что автор кода ниже назвал Root Controller. Я сам использовал это на нескольких сайтах, и это действительно дает хорошие URL-адреса, не требуя от вас создания большего количества контроллеров, которые вы хотели бы, или в конечном итоге дублирующих URL-адресов.

Этот маршрут находится в 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
        );

С этим определено в другом месте:

    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
    }

RootActionContraint позволяет вам использовать другие маршруты и не позволяет действиям RootController скрывать любые контроллеры.

Вам также необходимо создать контроллер с именем Root. Это не полная реализация. Прочитать оригинальную статью здесь

...