Настроить шаблон маршрута, используя app.UseMvc
in Startup.cs
app.UseMvc(routes =>
{
routes.MapRoute(
name: "BlogRoute",
template: "blog/{categorySlug}");
//.. other routes
});
Обновите ссылку, чтобы использовать этот маршрут
<a class="link" asp-route="BlogRoute"
asp-route-categorySlug="some-slug"
asp-route-page="1">1</a>
Немного измененное решение с использованием действий и контроллераимена
Конфигурация маршрута
routes.MapRoute(
name: "BlogRoute",
template: "blog/{categorySlug}",
defaults: new { controller = "Blog", action = "Category" });
Ссылка
<a class="link" asp-action="Category" asp-controller="Blog"
asp-route-categorySlug="some-slug"
asp-route-page="1">1</a>
Неудачная попытка
Можно задаться вопросом, что еслимы используем атрибут маршрутизации и принудительный тег поддержки, чтобы использовать этот маршрут (установив asp-route
)
[Route("blog")]
public class BlogController : Controller
{
[Route("{categorySlug}", Name = "BlogRoute")]
public async Task<IActionResult> Category([FromRoute] string categorySlug, [FromQuery] int page) {
//..
}
и код ссылки
<a class="link" asp-route="BlogRoute"
asp-route-categorySlug="some-slug"
asp-route-page="1">1</a>
В этом случае значение page
полностью игнорируетсяи полученный URL-адрес /blog/some-slug
Примечание
Различные тесты показали, что код в вашем вопросе действительно работает нормально, и вам не нужно добавлять маршрут в app.UseMvc
.Например, следующая ссылка
<a class="link" asp-route="BlogRoute"
asp-route-value="val1"
asp-route-data="info"
asp-route-categorySlug="some-slug">1</a>
генерирует этот URL-адрес
/blog/some-slug?value=val1&data=info
Но если вы добавите asp-route-page="1"
, он будет просто проигнорирован и вывод будет тем же.Оказывается, генерирование URL исключает параметры с конкретными именами, такими как page
, action
и controller
(area
работает нормально, возможно, есть больше ключевых слов).Поэтому мое решение - это просто обходной путь специально для page
имени параметра.Если вы попытаетесь добавить параметр action
или controller
, мое решение просто сгенерирует значение заглушки /path
.
Это означает, что вы можете просто использовать другое имя, отличное от page
, например,
<a class="link" asp-route="BlogRoute"
asp-route-categorySlug="some-slug"
asp-route-pageNum="1">1</a>
И связать параметр page
с pageNum
name
[Route("{categorySlug}", Name = "BlogRoute")]
public async Task<IActionResult> Category([FromRoute] string categorySlug, [FromQuery(Name = "pageNum")] int page)