【问题标题】:Razor Pages: Set cookie from _Layout.cshtmlRazor 页面:从 _Layout.cshtml 设置 cookie
【发布时间】:2018-12-15 18:12:15
【问题描述】:

在 _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,但这会导致一些问题:

  • 如果表单位于 _Layout.cshtml 中,“SetCulture”应该放在哪里? _Layout.cshtml 文件后面没有代码
  • 如何从anchor提交表单?如果我把 input type="submit" 它 完全破坏了菜单的外观。我知道我可以从 js 中做到这一点 但我尽量避免使用不是绝对需要的 js,尤其是 对于这些基本的东西..

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

【问题讨论】:

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


    【解决方案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";
    

    【讨论】:

      【解决方案2】:

      我还没有对此进行测试,但是如何使用 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>
      

      【讨论】:

        猜你喜欢
        • 2019-06-19
        • 2023-02-08
        • 2020-08-18
        • 2018-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-27
        • 1970-01-01
        相关资源
        最近更新 更多