0

У меня есть требование, при котором ресурсы на домашнем контроллере должны быть доступны без необходимости вводить имя контроллера в URL. Например, действие index должно быть загружено, когда я перехожу к mysite.com/, и контактная страница должна быть загружена с использованием mysite.com/contact и так далее.MVC 5 Маршрутизация атрибутов: удаление ненужного атрибута маршрута из действия контроллера

Контроллер ниже удовлетворяет этому требованию, но мне интересно, есть ли способ удалить атрибуты маршрута с тем же именем, что и действие контроллера?

Например, используя [Route("contact")] для действия контакт не имеет смысла. Когда я удаляю этот атрибут маршрута, URL-адрес генерируется как mysite.com/home/contact, тогда как я хочу, чтобы это было mysite.com/contact.

[RoutePrefix("")] // Remove the name of the controller from the URL 
public class HomeController : Controller 
{ 


    public ViewResult Index() 
    { 
     return View("Index"); 
    } 

    [Route("contact")] 
    public ViewResult Contact() 
    { 
     return View("Contact"); 
    } 

    [Route("about")] 
    public ViewResult About() 
    { 
     return View("About"); 
    } 

    [Route("terms-and-conditions")] 
    public ViewResult TermsAndConditions() 
    { 
     return View("TermsAndConditions"); 
    } 
} 

FYI, вот мой маршрут конфигурации:

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapMvcAttributeRoutes(); 

     routes.LowercaseUrls = true; 

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

и событие Application_Start:

protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 
     RouteConfig.RegisterRoutes(RouteTable.Routes); 
     BundleConfig.RegisterBundles(BundleTable.Bundles); 
    } 

ответ

0

Вместо того, чтобы использовать пустое значение в качестве префикса маршрута, я в конечном итоге с помощью маршрута для определенных действий контроллера, например:

public class HomeController : Controller 
{ 
    public ViewResult Index() 
    { 
     return View("Index"); 
    } 

    [Route("contact-us")] 
    public ViewResult Contact() 
    { 
     return View("Contact"); 
    } 

    [Route("about-us")] 
    public ViewResult About() 
    { 
     return View("About"); 
    } 

    [Route("terms-and-conditions")] 
    public ViewResult TermsAndConditions() 
    { 
     return View("TermsAndConditions"); 
    } 
} 

Это гарантирует, что каждый определенный маршрут будет доступен из корня сайта.