Убираем "Home" из названий ссылок в ASP.NET MVC
По умолчанию ASP.NET MVC генерирует дефолтный Home контроллер, для отображения базовых страниц, например, Index. Доступ к этой странице осуществляется без явного указания имени контроллера, например, http://msug.vn.ua/.
Но другие страницы – About, ContactUs и т.д. требуют указания в url названия контроллера (Home) и выглядит это таким образом:
http://msug.vn.ua/Home/About
Эммм, не по фэншую... Гораздо лучше иметь:
http://msug.vn.ua/About
Собственно, дальше о том, как это сделать.
Добавляем новый роут:
1 2 3 | routes.MapRoute( "Root" , "{action}" , new { controller = "Home" , action = "Index" , id = UrlParameter.Optional }, new { isMethodInHomeController = new RootRouteConstraint<HomeController>() }); |
Добавляем новый класс RootRouteConstraint
:
1 2 3 4 5 6 7 8 | 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()); } } |
Этот класс проверяет, содержит ли HomeController необходимые нам action и если да – переопределяет стандартный роут.
Для объявления ссылки на About нужно использовать привычный код:
1 | @Html.ActionLink( "About" , "About" , "Home" ) |
После этого вы можете наслаждаться короткими именами (что, собственно, и было сделано для msug.vn.ua).