我在我的网站上使用 asp.net 文化来以不同的语言显示网站,即荷兰语 (nl) 和法语 (fr)。该站点有一个按钮,可以通过将 ?lang=nl 添加到站点的 url 来将站点更改为另一种语言。当您更改语言时,会保存一个 cookie,以便您下次访问时保留该语言。
出于某种原因,该站点将看不到该 cookie。 cookie 在那里并被发送到服务器,我用 fiddler 检查过。有时它的值为 null 有时它是一个空字符串。
这是我在基页类中使用的代码:
protected override void InitializeCulture()
{
if (!Page.IsPostBack)
{
string cookieLang = "";
try
{
cookieLang = HttpContext.Current.Request.Cookies["UserSettings"]["lang"];
}
catch (Exception e)
{
Response.Write(string.Format("<!-- {0} -->", e.Message));
}
if (!string.IsNullOrEmpty(Request.QueryString["lang"]))
{
cookieLang = Request.QueryString["lang"].ToLower();
}
if (!string.IsNullOrEmpty(cookieLang))
{
string selectedCulture = cookieLang == "fr" ? "fr-BE" : "nl-BE";
this.Lang = cookieLang;
UICulture = selectedCulture;
Culture = selectedCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(selectedCulture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(selectedCulture);
Response.Cookies["UserSettings"]["lang"]= Lang;
Response.Cookies["UserSettings"].Expires = DateTime.Now.AddDays(7);
}
base.InitializeCulture();
}
}
谁能告诉我我做错了什么?
编辑: 我忘了告诉我这段代码在我的本地电脑上测试时工作正常,但部署在服务器上时却不起作用。
最佳答案
我认为您的错误在于您处理 cookie 的方式和事件的顺序。
- 第 1 步:尝试从 cookie 中获取区域性名称。如果它存在,请记住它。
- 第 2 步:尝试从查询字符串中获取区域性名称。如果它存在,请记住它。
- 第 3 步:根据以前的文化设置当前文化。
- 第 4 步:将区域性名称保存在 cookie 中。
以下代码对我始终有效:
protected override void InitializeCulture()
{
var cultureName = string.Empty;
// Step 1
var cookie = this.Request.Cookies["culture"];
if (cookie != null)
{
cultureName = cookie.Value;
}
// Step 2
var query = this.Request.QueryString["culture"];
if (query != null)
{
cultureName = query;
}
// Step 3
var culture = new CultureInfo(cultureName);
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
// Step 4
this.Response.Cookies["culture"].Value = culture.Name;
base.InitializeCulture();
}
关于c# - 无法读取cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20496721/