Razor плохой asp-маршрут связи - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь сделать систему нумерации страниц. Однако у меня есть проблема с моим кодом о asp-маршрутизации бритвы.

Вот контроллер:

[Route("blog")]
public class BlogController : BaseController
{
    [Route("{categorySlug}")]
    public async Task<IActionResult> Category([FromRoute] string categorySlug, [FromQuery] int page)
    {
          return View();
    }
}

А вот вспомогательный тег бритвы, используемый для генерации URL:

 <a class="link" asp-action="Category" asp-controller="Blog"
    asp-route-categorySlug="some-slug"
    asp-route-page="1">1</a>

Я ожидал, что сгенерированный href будет:

/blog/some-slug?page=1

Но вместо этого у меня есть следующий URL:

/Blog/Category?categorySlug=some-slug&page=1

Есть ли способ создать нужный URL с помощью asp-route?

1 Ответ

1 голос
/ 07 марта 2019

Настроить шаблон маршрута, используя 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)
...