SEO Friendly Route с поддержкой локализации - PullRequest
0 голосов
/ 26 марта 2020

После нескольких уроков, в основном этого Мне удалось реализовать поддержку локализации на моем Asp. Net Core 3.1 сайте, но теперь кажется, что маршрутизация не работает должным образом. Вот мои маршруты:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "TVShowsDetails",
        pattern: "tvshows/{id:int}/{*title}",
        defaults: new { controller = "tvshows", action = "details", id = 0 }
    );

    endpoints.MapControllerRoute(
        name: "LocalizedDefault",
        pattern: "{lang:lang}/{controller=Home}/{action=Index}/{id?}"
    );

    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{*catchall}",
        defaults: new { controller = "Home", action = "RedirectToDefaultLanguage", lang = "et" });

    endpoints.MapRazorPages();
});

Теперь, когда я создаю ссылку, используя этот код: <a asp-controller="TVShows" asp-action="details" asp-route-id="@id" asp-route-title="@title"> по какой-то причине создаваемая ссылка выглядит примерно так: https://localhost:44349/en/tvshows/details/1?title=title. Интересно, если я go по этой ссылке: https://localhost:44349/en/tvshows/1/title она показывает ту же страницу. Я пробовал href="Url.Action(...)", но он выдает тот же результат.

Если я удаляю {lang:lang}/ в начале шаблона, он генерирует правильную ссылку без языковой части (https://localhost:44349/tvshows/details/1?title=title), но мне нужно чтобы создать ссылки с текущим языком, так чего мне не хватает?

Редактировать

После нескольких попыток это работает:

endpoints.MapControllerRoute(
    name: "tvshowdetails",
    pattern: "{lang:lang}/{controller=tvshows}/{action=details}/{id?}/{title}"
);

Но я не хочу чтобы там было название действия (details). Это дает следующую ссылку:

https://localhost:44349/en/tvshows/details/1/breaking-bad

Я хочу следующую ссылку, однако:

https://localhost:44349/en/tvshows/1/breaking-bad

1 Ответ

1 голос
/ 29 марта 2020

Кажется, есть некоторые проблемы со схемами генерации URL, такими как у вас. NET Core 3.0, как описано в документации по маршрутизации . По сути, значения маршрута из текущего запроса не включаются в генерацию URL. Этот пост также предполагает, что это происходит, когда «страница назначения отличается от исходной страницы».

Документация предлагает использовать устаревшую маршрутизацию при столкновении с этой проблемой. Хотя у меня нет такого опыта для проектов *. 1016 * Core 3.0, у меня есть проект. NET Core 2.0 за несколько лет go, в котором также используются локализованные маршруты, поэтому я ожидаю, что это сработает.

Кроме того, вы можете явно передать текущий аргумент языка помощнику тега привязки. Из вашего исходного примера я получил его для работы со следующей маршрутизацией (обратите внимание на добавленный языковой параметр для TVShowsDetails маршрута)

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "TVShowsDetails",
        pattern: "{lang:lang}/tvshows/{id:int}/{*title}",
        defaults: new { controller = "tvshows", action = "details", id = 0 }
    );

    endpoints.MapControllerRoute(
        name: "LocalizedDefault",
        pattern: "{lang:lang}/{controller=Home}/{action=Index}/{id?}"
    );

    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{*catchall}",
        defaults: new { controller = "Home", action = "RedirectToDefaultLanguage", lang = "et" });

    endpoints.MapRazorPages();
});

, а затем сгенерировал ссылку, используя

<a asp-controller="tvshows"
   asp-action="details"
   asp-route-lang="@Context.Request.RouteValues["lang"]"
   asp-route-id="@id"
   asp-route-title="@title">
...