Убираем "Home" из названий ссылок в ASP.NET MVC

пятница, 5 августа 2011, Александр Краковецкий

По умолчанию ASP.NET MVC генерирует дефолтный Home контроллер, для отображения базовых страниц, например, Index. Доступ к этой странице осуществляется без явного указания имени контроллера, например, http://msug.vn.ua/.

Но другие страницы – About, ContactUs и т.д. требуют указания в url названия контроллера (Home) и выглядит это таким образом:

http://msug.vn.ua/Home/About

Эммм, не по фэншую... Гораздо лучше иметь:

http://msug.vn.ua/About

Собственно, дальше о том, как это сделать.

Добавляем новый роут:

routes.MapRoute("Root", "{action}",
              new { controller = "Home", action = "Index", id = UrlParameter.Optional },
              new { isMethodInHomeController = new RootRouteConstraint<HomeController>() });

Добавляем новый класс RootRouteConstraint:

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 нужно использовать привычный код:

@Html.ActionLink("About", "About", "Home")

После этого вы можете наслаждаться короткими именами (что, собственно, и было сделано для msug.vn.ua).


Ищите нас в интернетах!

Комментарии

Свежие вакансии