Невозможно создать правильные ссылки - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующий код на странице бритвы:

@Url.Action("ArticleDetails", "Information", new { slug = article.Slug })

URL-адрес страницы, на которой размещен этот код, имеет вид http://localhost/category/6/category-name, где 6 - идентификатор категории

В InformationController у меня есть следующие действия:

[HttpGet("article/{id}/{slug}")]
public IActionResult ArticleDetails(int id, string slug)
{
    // some code ...

    return View(data);
}

[HttpGet("article/{slug}")]
public IActionResult ArticleDetails(string slug)
{
    // some code ...

    return View(data);
}

Как я могу получить URL формы article/article-slug, потому что @Url.Action(...), который есть на странице, всегда пытается достичь действия контроллера сидентификатор, даже если идентификатор не указан как анонимный тип.

Ссылки принимают форму article/6/article-slug, вместо этого я хочу, чтобы они были article/article-slug без удаления действия с идентификатором в контроллере.

Я заметил, что 6 от id категории.Также, если я удалю действие контроллера с помощью Id, я получу правильный формат URL.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Маршрутизация может быть привередливой, когда вы пытаетесь делать такие перегрузки.Лучше всего использовать именованные маршруты:

[HttpGet("article/{id}/{slug}", Name = "ArticleDetailsIdSlug")]
public IActionResult ArticleDetails(int id, string slug)

[HttpGet("article/{slug}", Name = "ArticleDetailsSlug")]
public IActionResult ArticleDetails(string slug)

Тогда, на ваш взгляд:

@Url.RouteUrl("ArticleDetailsSlug", new { slug = article.Slug })

Теперь инфраструктура маршрутизации не должна пытаться выяснить, какой маршрут вына самом деле хотите (и, очевидно, догадаетесь неверно), поскольку вы точно сказали, какой маршрут использовать.

0 голосов
/ 01 июня 2018

При разрешении действия, на которое вы ссылаетесь, экземпляр IUrlHelper использует текущее значение id в вашем текущем маршруте (http://localhost/category/6/category-name),, которое имеет значение 6, как вы указалив вашем OP. Поскольку существует действие ArticleDetails, которое принимает как id, так и slug (которое вы предоставляете явно), выбрано действие ArticleDetails, которое принимает оба эти параметра.

Чтобы решить эту проблему, есть пара опций. Первый вариант - очистить значение RouteData, как только вы использовали его в действии, вызванном при достижении http://localhost/category/6/category-name. Чтобы сделать это,Вы можете использовать следующий код в указанном действии:

RouteData.Values.Remove("id");

Я не фанат этого, но это работает. ИМО, лучше бы просто использовать разные имена дляПараметр id: например, categoryId и articleId в соответствующих контроллерах. Это устранит вашу проблему и сделает код более читабельным в соответствующих действиях. Ваше действие ArticleDetails просто изменится на:

[HttpGet("article/{articleId}/{slug}")]
public IActionResult ArticleDetails(int articleId, string slug)
{
    // some code ...

    return View(data);
}
...