Маршрутизация Asp.Net Core Endpoint - PullRequest
0 голосов
/ 25 октября 2019

У меня есть Action в Controller:

[Route("")]
[Route("{pageNumber?}")]
[Route("tag/{tagSlug?}/{pageNumber?}")]
public async Task<IActionResult> Index(int? pageNumber, string tagSlug = null, string searchTerm = null)
{
    var model = await repoPm_.GetPage(pageNumber, tagSlug, searchTerm);
    return View(model);
}

Каждый элемент имеет список тегов, связанных с ним

@foreach (var t in item.Tags)
{
    <a asp-action="Index" asp-route-tagSlug="@t.TagSlug" class="mr-3">@t.Name</a>
}

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

<a asp-area="" asp-controller="Items" asp-action="Index" asp-route-tagSlug="">Items</a>
<a asp-area="" asp-controller="Items" asp-action="Index" asp-route-tagSlug="@null">Items</a>
<a asp-area="" asp-controller="Items" asp-action="Index">Items</a>

Когда я не на этой странице, ссылка на панели навигации указывает на /items/tag, что раздражает, но работает.

Когда я нахожусь на этой странице и нажимаю на один из тегов, то URL в омнибаре является правильным, то есть /items/tag/fancy-items

Проблема заключается в том, что также генерируется URLдля ссылки в моем navbar, то есть /items/tag/fancy-items, когда она должна быть просто /items

Что я делаю не так? Я не хочу связываться с маршрутизацией в Startup.cs, похоже, <a asp-area="" asp-controller="Items" asp-action="Index">Items</a> должно просто работать

1 Ответ

1 голос
/ 25 октября 2019

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

Таким образом, вызов вашего действия Index без параметров может быть достигнут только с помощью /items,и поведение связывания во время выполнения ASP.NET не будет некорректно разрешено для другого URL.

Я бы предложил сделать перегрузки вызовов Action верхнего уровня, которые разрешают один и тот же базовый метод для повторного использования.

[Route("")]
public async Task<IActionResult> Index()
{
    return await WrappedMethod(null);
}


[Route("tag/{pageNumber}")]
public async Task<IActionResult> Index(int pageNumber)
{
    return await WrappedMethod(pageNumber);
}

[Route("tag/{tagSlug}/{pageNumber}")]
public async Task<IActionResult> Index(string tagSlug, int? pageNumber)
{
    return await WrappedMethod(pageNumber, tagSlug);
}

private async Task<IActionResult> WrappedMethod(int? pageNumber, string tagSlug = null, string searchTerm = null)
{
    var model = await repoPm_.GetPage(pageNumber, tagSlug, searchTerm);
    return View(model);
}

Обратите внимание, что обнуляемость самих параметров будет зависеть от ваших сценариев использования.

...