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