Как правильно перенаправить свойство на новый маршрут в ASP.NET Core 2.2? - PullRequest
1 голос
/ 09 июля 2019

У меня есть проект, написанный на C # поверх платформы ASP.NET Core 2.2.

В моем приложении много URL-адресов, которые отправляются поисковым системам. Я хочу сделать URL-адреса немного короче, поэтому я решил создать новый маршрут и перенаправить старый ORL на новый.

Это то, что я сделал

[Route("Listings/details/{id}/{name:slugify}", Name = "Details")]
public IActionResult Details(InfoVM model)
{
    return RedirectToRoutePermanent("NewDetails", model);
}


[Route("i/{id}/{name:slugify}", Name = "NewDetails")]
public IActionResult Info(InfoVM model)
{
    // do something with the model before passing it to the view

    return View(model);
}

Теперь, когда я иду на /i/123/some-slug, это работает! Однако, когда я перехожу на /Listings/details/123/some-slug, я получаю следующую ошибку

InvalidOperationException: ни один маршрут не соответствует предоставленным значениям.

Ожидается, что конечная точка /Listings/details/123/some-slug перенаправит меня на /i/123/some-slug с HTTP-кодом 301.

Как я могу перенаправить на новый маршрут навсегда?

1 Ответ

1 голос
/ 09 июля 2019

Вместо привязки запроса к InfoVM объекту, связывайте их с переменными.Из вашего маршрута кажется, что вы заботитесь только о значениях id и name.Измените свою сигнатуру действия и выполните перенаправление следующим образом

[Route("Listings/details/{id}/{name:slugify}", Name = "Details")]
public IActionResult Details(int id, string name)
{
    return RedirectToRoutePermanent("NewDetails", new { id, name });
}

Поскольку запрос на перенаправление передает значения с использованием маршрута, вам необходимо добавить атрибут [FromRoute] к вашему привязываемому объекту, чтобы он знал, где найти значения для привязки.от этого

[Route("i/{id}/{name:slugify}", Name = "NewDetails")]
public IActionResult Info([FromRoute]InfoVM model)
{
    // do something with the model before passing it to the view

    return View(model);
}
...