Маршрутизация атрибутов в MVC 5 и необязательные значения по умолчанию
традиционные значения по умолчанию маршрутизации означали, что мы смогли получить доступ к этим URL-адресам и всегда заканчиваем одним и тем же действием:
/
/Home
/Home/Index
но сегодня мы бы писали что-то в этих строках:
[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
    public ActionResult Index() {}
    public ActionResult ...
}
но это определение маршрутизации отнюдь не то же самое.
/           (fails)
/Home       (works)
/Home/Index (works)
поэтому, если мы изменим верхний код на
[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
    [Route("~/")]
    public ActionResult Index() {}
    public ActionResult ...
}
но затем мы переворачиваем обработку вверх дном:
/           (works)
/Home       (fails)
/Home/Index (fails)
мы могли бы сделать декларативный код более подробным и сделать его работа как старомодная маршрутизация механизм:
[RoutePrefix("Home")]
[Route("{action=Index}")]
public class HomeController
{
    [Route("~/")]
    [Route("~/Home")]
    [Route("~/Home/Index")]
    public ActionResult Index() {}
    public ActionResult ...
}
это работает со всеми тремя разными маршрутами.
вопрос
этот вопрос, конечно, связан с самим действие по умолчанию приложения это контроллер по умолчанию и действие. Просто интересно, это единственный способ сделать это? есть ли менее подробный код способ заставить его работать так, как ожидалось?
2 ответов
Да, верно..что у вас есть способ сделать здесь...
Я немного изменил код здесь:
[RoutePrefix("Home")]
[Route("{action}")]
public class HomeController
{
   [Route("~/")]    // GET /
   [Route]          // GET /Home
   [Route("Index")] // GET /Home/Index
   public ActionResult Index() {}
   public ActionResult ...
}
некоторые детали:
1. Ваш первый случай не совсем совпадает с обычной маршрутизацией, так как в этом случае у вас есть буквальный сегмент Home который не похож на обычную маршрутизацию, необязательную {controller}/{action}/{id} and controller = Home, action=Index,id=optional.
2. Ваш второй случай ожидается как по дизайну, если a Route атрибут используется при действии атрибуты на контроллере не принимают эффект.
прямо сейчас для SEO вы должны использовать канонический url, означающий один url-адрес, что-то вроде этого
public class HomeController
{
   [Route("~/")]    // GET /
   public ActionResult Index() {}
   public ActionResult ...
}
таким образом, домашний контроллер доступен только в root
