Как настроить маршрутизацию ASP.NET MVC, чтобы скрыть имя контроллера на «домашней» странице? - PullRequest
2 голосов
/ 02 сентября 2010

Исходя из этого вопроса:

Маршрутизация 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.

Ответы [ 2 ]

6 голосов
/ 02 сентября 2010

Попробуйте:

   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 контроллера.

0 голосов
/ 15 января 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. Все остальные контроллеры будут иметь функции маршрутизации по умолчанию.

...