剃刀页面:从_Layout.cshtml设置cookie

时间:2018-12-15 18:12:15

标签: c# asp.net-core culture razor-pages

在_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”。问题是我真的不知道如何从剃须刀页面上做到这一点。我认为我应该将with asp-page-handler设置为某种方法(例如“ SetCulture”),并在该方法中设置cookie,但这会导致一些问题:

  • 如果表单位于_Layout.cshtml中,则在何处放置“ SetCulture”? _Layout.cshtml文件中没有代码
  • 如何从 anchor 提交表单?如果我输入 input type =“ submit” 完全破坏了菜单的外观。我知道我可以从js做到这一点 但我尽量避免在并非绝对必要的地方使用js,尤其是 这些基本的东西。

我在这里可能会遗漏一些非常基本的东西,对于Razor Pages来说我还是很新。从事后看来,我应该坚持使用MVC,但据说Razor Pages更加容易。

2 个答案:

答案 0 :(得分:1)

我还没有测试过,但是如何使用JavaScript设置cookie,然后重新加载页面呢?服务器端剃须刀页面代码应检查代码而不是查询参数。

类似于_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>

答案 1 :(得分:1)

谢谢,布拉德。您提出的解决方案效果很好。同时,我在其他地方也有其他建议,我也将其发布给以后寻找答案的任何人。

在_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>

在Index的代码后方(或任何其他具有代码后继的页面)中:

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中必须有信息>>配置:

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";