Перенаправить на культуру по умолчанию, если культура не указана в URL - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь сделать что-то вроде того, что Microsoft использует для сайта документации.например, когда я ввожу приведенную ниже ссылку в адресную строку, сайт Microsoft Office переадресовывает меня на стандартную ссылку по умолчанию, как во второй ссылке.

первая ссылка: https://docs.microsoft.com/aspnet/core/fundamentals/localization?view=aspnetcore-2.2 вторая ссылка: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2

Я прошёл шаг за шагом с этой статьей (https://joonasw.net/view/aspnet-core-localization-deep-dive), и проект успешно запущен, и я могу изменить культуру, вызывая URL-адреса вроде

localhost:5001/tr-TR/home/index ({culture}/[controller]/[action]) 

, но когда я пытаюсь перенаправить на

localhost:5001/home/index (without culture route value)

Я получаю сообщение об ошибке 404.

Мне нужно перенаправить вышеуказанную ссылку в какое-либо действие общего контроллера и затем перенаправить его на

localhost:5001/{defaultculture}/home/index

Спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Для https://docs.microsoft.com, он использовал функцию перенаправления URL для реализации маршрута от https://docs.microsoft.com/aspnet/core/fundamentals/localization?view=aspnetcore-2.2 до https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization?view=aspnetcore-2.2.Если вы проверите журнал запросов на https://docs.microsoft.com/aspnet, вы найдете первый запрос, он возвращает ответ с Status Code: 301, а затем возвращает https://docs.microsoft.com/en-us/aspnet.

По вашему требованию, если вам нужно только localhost:5001/home/index, чтобы вернуть представление с localhost:5001/en-us/home/index без изменения URL-адреса на localhost:5001/en-us/home/index.Вы можете попробовать

var localizationOptions = app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value;
var requestProvider = new RouteDataRequestCultureProvider();
localizationOptions.RequestCultureProviders.Insert(0, requestProvider);
app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture=en-US}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions);

        subApp.UseMvc(mvcRoutes =>
        {
            mvcRoutes.MapRoute(
                name: "default",
                template: "{culture=en-US}/{controller=Home}/{action=Index}/{id?}");
        });
    });

});

Если вам нужен такой же URL-адрес, как и localhost:5001/en-us/home/index, вам также необходимо выполнить действие перенаправления.

app.Use(async (context, next) =>
{
    await next.Invoke();
    if (context.Response.StatusCode == StatusCodes.Status404NotFound)
    {
        context.Response.Redirect(@"/en-us/Home/Index", true);
    }
});

app.UseRouter(routes =>
{
    routes.MapMiddlewareRoute("{culture}/{*mvcRoute}", subApp =>
    {
        subApp.UseRequestLocalization(localizationOptions);

        subApp.UseMvc(mvcRoutes =>
        {
            mvcRoutes.MapRoute(
                name: "default",
                template: "{culture}/{controller=Home}/{action=Index}/{id?}");
        });
    });

});
0 голосов
/ 12 декабря 2018

Вам нужно изменить свой маршрут.В приведенном ниже примере, когда пользователь вводит localhost:5001/home/index, он будет перенаправлен на RedirectToCulture действие в Home контроллере.Теперь вы можете читать параметры (или нет) и перенаправлять с культурой по умолчанию

routes.MapRoute(
    name: "default1",
    template: "{culture:required}/{controller:required}/{action:required}/{id?}",
    defaults: new { culture = "en-US", controller = "Home", action = "Index" });

routes.MapRoute(
    name: "default2",
    template: "{stringController?}/{stringAction?}/{id?}",
    defaults: new { controller = "Home", action = "RedirectToCulture" });
...