Как настроить маршрутизацию ASP.NET MVC, чтобы скрыть имя контроллера на домашней странице?

Следуя этому вопросу:

Маршрутизация ASP.NET MVC с контроллером по умолчанию

У меня есть аналогичное требование, когда мой конечный пользователь не хочет видеть имя контроллера в URL-адресе целевой или «домашней страницы» своего приложения.

У меня есть контроллер с именем DeviceController, который я хочу быть контроллером "домашней страницы". Этот контроллер имеет ряд действий, и я хотел бы использовать следующие URL-адреса:

http://example.com  -> calls Index()  
http://example.com/showdevice/1234 -> calls ShowDevice(int id)  
http://example.com/showhistory/1224 -> calls ShowHistory(int id)  

Мне также нужны ссылки, созданные для этого контроллера, чтобы не включать /device часть URL-адреса.

У меня также есть ряд других контроллеров, например BuildController:

http://example.com/build  
http://example.com/build/status/1234  
http://example.com/build/restart/1234  

и так далее. URL-адреса для этих контроллеров в порядке.

Проблема в том, что я просто не могу разобраться в маршрутизации для этого даже после изучения ответов на вопрос, упомянутый выше.

Может ли кто-нибудь предоставить образец кода, объясняющий, как это сделать?

Я использую ASP.NET MVC2.


person Kev    schedule 02.09.2010    source источник


Ответы (2)


Попробуй это:

   private void RegisterRoutes(RouteCollection routes) {

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

      routes.MapRoute("default", "{controller}/{action}/{id}",
         new { action = "index", id = "" },
         // Register below the name of all the other controllers
         new { controller = @"^(account|support)$" });

      routes.MapRoute("home", "{action}",
         new { controller = "device", action = "index" });
   }

например / foo

Если foo не является контроллером, то это рассматривается как действие контроллера device.

person Max Toro    schedule 02.09.2010
comment
Есть ли способ сделать это без необходимости вручную перечислять все остальные контроллеры в регулярном выражении? - person Jacob Stamm; 27.07.2016

Шаг 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:
Добавьте новое сопоставление маршрута над сопоставлением по умолчанию, которое использует только что созданное ограничение маршрута. Общий параметр должен быть классом контроллера, который вы планируете использовать в качестве «корневого» контроллера.

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.

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

person Rahul    schedule 15.01.2016
comment
Привет! Как перенаправить domain.com/Home/About на domain.com/About, не затрагивая любой другой контроллер. - person Sudipta Banerjee; 17.12.2016
comment
Как я объяснил выше, добавьте в свой проект приведенный выше код. Он будет соответствовать вашим требованиям. - person Rahul; 18.12.2016