Перенаправить на культуру по умолчанию, если культура не указана в URL-адресе

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

первая ссылка: 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)


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

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" });
person J. Doe    schedule 12.12.2018
comment
Привет, Дж. Доу, спасибо за ответ, будет ли это работать с маршрутизацией атрибутов? например, когда у меня есть [Route(ShowSales)] поверх действия индекса HomeController, будет ли это работать? кстати попробую - person mesut; 13.12.2018
comment
Пробовали и терпели неудачу, мы всегда должны добавлять {ui-culture} перед каждым атрибутом маршрута. - person mesut; 13.12.2018
comment
Затем добавьте в действие RedirectToCulture перенаправление на действие с культурой (return RedirectToAction("Index", new { culture = "en-US" });). Это точка этой маршрутизации - person J. Doe; 13.12.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?}");
        });
    });

});
person Edward    schedule 13.12.2018
comment
Привет, Тао. Спасибо за ваш ответ, но я хочу перенаправить каждый запрос, полученный без культуры, на тот же URL-адрес запроса, но с добавлением к нему культуры по умолчанию. - person mesut; 13.12.2018
comment
@mesut Вы можете сгенерировать путь перенаправления на основе ваших собственных требований к context.Response.Redirect(@"/en-us/Home/Index", true);. - person Edward; 14.12.2018