Маршрутизация MVC без контроллера в URL

#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-routing

#asp.net-mvc #asp.net-mvc-3 #asp.net-mvc-routing

Вопрос:

Как мне настроить ASP.NET Маршрутизация MVC 3, поэтому в URL-адресе не отображается контроллер?

Вот мои маршруты

 routes.MapRoute(
            "Default", 
            "{controller}/{action}/{id}", 
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
        );

        routes.MapRoute(
            "HomeActions", 
            "{action}", 
            new { action= "AboutUs" } 
        );
  

Мне нужен url:

 mysite.com/AboutUs
  

Но у меня есть

  mysite.com/Home/AboutUs
  

Ответ №1:

Я был бы очень конкретен в отношении URL, который вы хотите маршрутизировать. И поместите его над маршрутом по умолчанию.

     routes.MapRoute(
        "HomeActions", 
        "AboutUs", 
        new { controller = "Home", action= "AboutUs" } 
    );

    routes.MapRoute(
        "Default", 
        "{controller}/{action}/{id}", 
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
    );
  

Менее специфичный маршрут, подобный тому, который вы предложили, может иметь нежелательные последствия. Особенно, если указан ниже маршрута по умолчанию.

 routes.MapRoute(
    "HomeActions", 
    "{action}", 
    new { controller = "Home", action= "AboutUs" } 
);
  

Например, если указанный выше маршрут добавлен после значения по умолчанию, то URLhttp://www.example.com/AboutUs скорее всего, будет соответствовать маршруту {controller = «AboutUs», action = «Index», id = UrlParamter.Необязательно}. Если вы добавили маршрут выше маршрута по умолчанию, то поиск URLhttp://www.example.com/Users которое вы, возможно, захотите сделать действием индекса на пользовательском контроллере, теперь будет искать действие пользователей на домашнем контроллере.

Итак, я бы посоветовал быть конкретным в отношении подобных маршрутов.

Комментарии:

1. «И поместите его выше маршрута по умолчанию» помогло, спасибо

Ответ №2:

Вам нужно добавить маршрут без {controller} части и указать имя контроллера в параметре defaults.

Комментарии:

1. Не неправильный ответ, но мог бы быть более конкретным. Скрытие имени контроллера может иметь последствия.

2. Спасибо за ваш ответ, но это не сработает. Я пробую: маршруты. MapRoute( «HomeActions», «{действие}», новый {контроллер=»Home» } );

3. @Victoria: Вам нужно указать это перед другим маршрутом, иначе он никогда не будет достигнут (поскольку другой маршрут сначала соответствует URL-адресам)