我已经看了很多类似的问题,但没有解决我的问题。我将用户语言保存在cookie中。首先,它是一个Umbraco网站。我有一个默认控制器,每个请求都会被命中以检查语言。
我做一些计算来检查用户应该在控制器中使用哪种语言,然后像下面那样设置cookie。
private void SetCulture(string language, bool updateCookie)
{
if (updateCookie)
{
var newCookie = new HttpCookie("currentLanguage", language) { Expires = DateTime.Now.AddDays(30) };
Response.Cookies.Add(newCookie);
Request.Cookies.Add(newCookie);
}
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(language);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
}
目前,我正在更新请求和响应Cookie。问题是在我点击控制器之后,我加载了我的视图。在我看来,我使用帮助器来获取当前的cookie值,但请求中的cookie尚未更新并仍保持其原始值。例如,假设用户在EN页面上,他们使用语言切换器更改为FR,我使用上面的SetCulture
方法更新控制器中的cookie,但是在我的帮助程序类中,cookie仍设置为原始EN值。 CookieHelper
位于下方。
public static class CookieHelper
{
public static string GetLanguageCookie()
{
var newCookie = HttpContext.Current.Request.Cookies["currentLanguage"];
return newCookie?.Value ?? "en";
}
public static void UpdateLanguageCookie(string lang)
{
var newCookie = HttpContext.Current.Request.Cookies["currentLanguage"];
if (newCookie?.Value != null)
{
newCookie.Value = lang;
newCookie.Expires = DateTime.Now.AddDays(30);
}
else
{
CreateLanguageCookie(lang);
}
}
public static void CreateLanguageCookie(string lang)
{
var newCookie = new HttpCookie("currentLanguage", lang) { Expires = DateTime.Now.AddDays(30) };
HttpContext.Current.Response.Cookies.Add(newCookie);
}
}
以下控制器仅针对问题相关代码进行了删减。为了澄清,该网站分为英国,法国和德国的区域部分。每个地区网站都有一组允许的语言DE =" en,de" uk =" en"和fr =" fr"。奇怪的设置我知道,但我只是遵循规范。希望解释使代码更清晰。
public class BaseRenderController : RenderMvcController
{
public override ActionResult Index(RenderModel model)
{
var language = Request.UserLanguages.First().ToLowerInvariant().Substring(0, 2);
// If true it means where on the language select screen.
if (Request.Url.Segments.Length == 1)
{
if (language == "en")
{
SetCulture("en", false);
}
else if (language == "fr")
{
SetCulture("fr", false);
}
else if (language == "de")
{
SetCulture("de", false);
}
else
{
SetCulture("en", false);
}
}
else
{
var currentLang = CookieHelper.GetLanguageCookie();
if (Helpers.UrlHelper.GetRegionalSegmentFromUrl().Substring(1).ToLower() == "uk")
{
SetCulture("en", true);
}
else if (Helpers.UrlHelper.GetRegionalSegmentFromUrl().Substring(1).ToLower() == "fr")
{
SetCulture("fr", true);
}
else if (Helpers.UrlHelper.GetRegionalSegmentFromUrl().Substring(1).ToLower() == "de")
{
if (language == "de" || currentLang == "de")
{
SetCulture("de", true);
}
else
{
SetCulture("en", true);
}
}
}
return base.Index(model);
}
private void SetCulture(string language, bool updateCookie)
{
if (updateCookie)
{
var newCookie = new HttpCookie("currentLanguage", language) { Expires = DateTime.Now.AddDays(30) };
Response.Cookies.Add(newCookie);
Request.Cookies.Add(newCookie);
}
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(language);
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
}
}
答案 0 :(得分:0)
浏览器在发送请求时设置cookie。 ASP.NET提供从Request对象访问Cookie的权限。要设置cookie,您需要在Response对象上设置它。或者正如Miscrosoft的文档所述:
浏览器负责管理用户系统上的cookie。 Cookie通过HttpResponse对象发送到浏览器 公开名为Cookies的集合。您可以访问HttpResponse object作为Page类的Response属性。任何饼干 您要发送到浏览器的必须添加到此集合中。