маршрут по умолчанию с идентификатором не работает в ядре asp.net - PullRequest
0 голосов
/ 01 октября 2018

Это мой контроллер:

public class HomeController : Controller
{
    public IActionResult Index()
    {
        var route = Request.Path.Value;
        return View("index" as object);
    }

    [HttpGet("{id}")]
    public IActionResult Index(int id)
    {
        return View("index id" as object);
    }
}

Это мой маршрут:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

url: / 1 -> индекс возврата с идентификатором
url: / Home / Index/ 1 -> индекс возврата без идентификатора

Я не понимаю, почему?

1 Ответ

0 голосов
/ 01 октября 2018

Вы используете смешанную маршрутизацию - у вас есть обычная маршрутизация для первого действия и атрибутная маршрутизация для второго.

Когда вы переходите к /1, вы выполняете второе действие с параметром id, поскольку он настроен на использование маршрутизации атрибута для пути /{id} (с помощью [HttpGet("{id}")]): переопределение атрибута переопределяет обычная маршрутизация.

Когда вы переходите к /Home/Index/1, вы выполняете свое первое действие без параметра id, просто потому, что другое имеющееся у вас действие больше не соответствует, если оно установлено виспользуйте атрибут маршрутизации (/{id}), чтобы он больше не совпадал с /Home/Index/1.С вашим обычным шаблоном маршрутизации от UseMvc вы сказали, что id является необязательным, и поэтому совпадение все еще действует.

Для достижения того, что вы ищете, вы можете использовать атрибутную маршрутизациюисключительно для этого контроллера.Вот как это будет выглядеть:

[Route("/")]
[Route("[controller]/[action]")]
public class HomeController : Controller
{
    public IActionResult Index()
    {
        ...
    }

    [HttpGet("{id}")]
    public IActionResult Index(int id)
    {
        ...
    }
}

Добавление двух атрибутов [Route(...)] добавляет поддержку следующих двух маршрутов:

  1. / и /{id}.
  2. /Home/Index и /Home/Index/{id}.

[controller] и [action] - это заполнители, которые представляют имя контроллера и действие соответственно. Вы также можете просто использоватьбуквальные значения Home и Index, если вы предпочитаете что-то более фиксированное.

Вам не обязательно нужны оба [Route(...)] атрибуты, но версия / обеспечиваетКорень сайта также соответствует той же паре контроллер / действие.

...