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