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 }
);
Может ли кто-нибудь помочь мне?
Ответы
Ответ 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 будут иметь функциональные возможности маршрутизации по умолчанию.