Перенаправить на культуру по умолчанию, если культура не указана в URL
Я пытаюсь сделать что-то вроде того, что Microsoft использует для сайта документации. например, когда я ввожу приведенную ниже ссылку в адресной строке, сайт Microsoft Office 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 ответа
За 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?}");
});
});
});
Вам нужно изменить свой маршрут. В приведенном ниже примере, когда пользователь вводит 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" });