Razor Pages: установить cookie из _Layout.cshtml - PullRequest
0 голосов
/ 15 декабря 2018

В _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 в этом методе, но это вызывает некоторые проблемы:

  • куда поместить «SetCulture ", если форма будет в _Layout.cshtml?В _Layout.cshtml нет кода за файлом
  • как отправить форму из anchor ?Если я поставлю input type = "submit" , это полностью разрушит внешний вид меню ... Я знаю, что могу сделать это из js, но я стараюсь избегать js там, где это не обязательно, особенно для таких базовых вещей..

Я мог бы упустить что-то очень простое здесь, я все еще плохо знаком с Razor Pages.Оглядываясь назад, я, вероятно, следовало придерживаться MVC, но Razor Pages, как говорили, были проще ..

Ответы [ 2 ]

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

Спасибо, Брэд.Решение, которое вы предложили, работает хорошо.В то же время у меня есть и другое предложение в другом месте, и я опубликую его для всех, кто ищет ответ в будущем.

В _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";
0 голосов
/ 17 декабря 2018

Я не проверял это, но как насчет установки 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>
...