Razor Pages:从 _Layout.cshtml 设置 cookie
Razor Pages: Set cookie from _Layout.cshtml
在 _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 更容易..
我还没有对此进行测试,但是如何使用 JavaScript 设置 cookie,然后重新加载页面呢?服务器端剃刀页面代码应该检查代码而不是查询参数。
_Layout 页面上的内容类似于以下内容。修改菜单以调用 JS 函数而不是带有查询参数的 link。在 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>
谢谢布拉德。您提出的解决方案效果很好。与此同时,我在其他地方也得到了其他建议,我也会 post 为将来搜索答案的任何人提供。
在_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>> 配置中必须有信息:
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";
在 _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 更容易..
我还没有对此进行测试,但是如何使用 JavaScript 设置 cookie,然后重新加载页面呢?服务器端剃刀页面代码应该检查代码而不是查询参数。
_Layout 页面上的内容类似于以下内容。修改菜单以调用 JS 函数而不是带有查询参数的 link。在 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>
谢谢布拉德。您提出的解决方案效果很好。与此同时,我在其他地方也得到了其他建议,我也会 post 为将来搜索答案的任何人提供。
在_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>> 配置中必须有信息:
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";