Подтвердить что ты не робот

MVC 4 Удалите "домашний" из базового маршрута

В основном я хочу сделать так, чтобы: http://website.com/Home/About

Показывает как: http://website.com/About

"Домашний" контроллер, отображающийся в URL-адресе, сделает URL-адрес более длинным для чтения пользователем.

Я попытался сделать следующее:

routes.MapRoute(
            name: "About",
            url: "",
            defaults: new { controller = "Home", action = "About", id = UrlParameter.Optional }
            );

Может ли кто-нибудь помочь мне?

4b9b3361

Ответ 1

Попробуйте что-то вроде этого:

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

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

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

Ответ 2

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

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

        routes.LowercaseUrls = true;

        routes.MapMvcAttributeRoutes();

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

И в вашем домашнем контроллере:

    [Route("About")]
    public ActionResult About()
    {
        return View();
    }

Ответ 3

Шаг 1: Создайте ограничение маршрута.

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());
        }
    }

Шаг 2:
Добавьте новое сопоставление маршрутов над вашим сопоставлением по умолчанию, которое использует ограничение маршрута, которое мы только что создали. Общий параметр должен быть классом контроллера, который вы планируете использовать в качестве вашего контроллера "Root".

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}
                    );

Теперь вы должны иметь доступ к своим методам домашнего контроллера, например: example.com/about, example.com/contact

Это повлияет только на HomeController. Все остальные контроллеры Alll будут иметь функциональные возможности маршрутизации по умолчанию.