В _Layout.cshtml у меня есть меню для изменения языка приложения, например:
<nav id = "nav-lang">
<ul>
<li>
<a href = "?culture=en-EN">EN</a>
</li>
<li>
<a href = "?culture=pl-PL">PL</a>
</li>
</ul>
</nav>Что он делает, так это перезагружает страницу и устанавливает новую культуру - работает хорошо. Дело в том, что если пользователь меняет культуру, а затем переходит на другую страницу в моем приложении, загружается культура по умолчанию. Я проверил свои варианты, и, похоже, лучшим вариантом является установка файла cookie UserCulture, например, «c = pl-PL | uic = pl-PL». Дело в том, что я действительно не знаю, как это сделать с помощью бритвенных страниц. Я думаю, что у меня должен быть asp-page-handler, установленный на некоторый метод (например, "SetCulture"), и в этом методе должен быть установлен файл cookie, но это вызывает некоторые проблемы:
Возможно, мне не хватает чего-то очень простого, но я все еще новичок в Razor Pages. Оглядываясь назад, я, вероятно, должен был придерживаться MVC, но Razor Pages был назван Полегче ..





Я не проверял это, но как насчет установки файла cookie с помощью JavaScript, а затем перезагрузки страницы. Код страницы бритвы на стороне сервера должен проверять код, а не параметр запроса.
Что-то вроде следующего на странице _Layout. Измените меню, чтобы вызвать функцию JS вместо ссылки с параметром запроса. В JS установите cookie и перезагрузите страницу.
<nav id = "nav-lang">
<ul>
<li class = "nav-item" onClick = "setCulture('en-EN')">EN</li>
<li class = "nav-item" onClick = "setCulture('pl-PL')">PL</li>
</ul>
</nav>
...
<script>
function setCulture(culture) {
document.cookie = "culture = "+culture;
location.reload();
}
</script>
Спасибо, Брэд. Предложенное вами решение работает хорошо. Тем временем у меня есть еще одно предложение в другом месте, и я тоже отправлю его для тех, кто будет искать ответ в будущем.
В _Layout.cshtml:
<nav id = "nav-lang">
<ul>
<li><a asp-page = "/Index" asp-page-handler = "SetCulture" asp-route-culture = "en-EN">EN</a></li>
<li><a asp-page = "/Index" asp-page-handler = "SetCulture" asp-route-culture = "pl-PL">PL</a></li>
</ul>
</nav>
В коде программной части индекса (или любой другой страницы с выделенным кодом):
public async Task<IActionResult> OnGetSetCultureAsync(string culture)
{
HttpContext.Response.Cookies.Append("Culture", "c = " + culture + "|uic = " + culture);
var returnUrl = Request.Headers["Referer"].ToString();
if (returnUrl.Contains("?culture = "))
{
var url = returnUrl.Substring(0, returnUrl.IndexOf("?culture = "));
return Redirect(url + "?culture = " + culture);
}
else
{
return Redirect(returnUrl + "?culture = " + culture);
}
}
И, конечно же, чтобы оба решения работали, в Startup.cs должна быть информация >> Configure:
var supportedCultures = new[]
{
new CultureInfo("en-US"),
new CultureInfo("pl-PL")
};
var lo = new RequestLocalizationOptions // Localization Options
{
DefaultRequestCulture = new RequestCulture("en-US"),
SupportedCultures = supportedCultures,
SupportedUICultures = supportedCultures
};
var cp = lo.RequestCultureProviders.OfType<CookieRequestCultureProvider>().First(); // Culture provider
cp.CookieName = "Culture";