我正在使用ASP.NET MVC应用程序(使用Kentico Cloud),并希望对其进行扩展以支持两种语言。 我想将语言选择存储在cookie中。我创建了一个包含获取Cookie的方法的基本控制器。
使用Kentico Cloud,每当我想在页面上显示任何内容时,我都需要传递当前的语言代码,这意味着我需要多次读取同一cookie。
我的想法是将cookie存储在基类属性中。切换语言后,Cookie和属性将被更新,因此该值始终是最新的。每当需要cookie时,我都会简单地读取属性,而不是一遍又一遍地获取cookie。
这是为了使解决方案更易于使用并且更具可读性。
我面临的问题是,当我切换语言时,cookie和属性会在基本控制器中更新,但是当我随后调用控制器的Index Action时,该属性的值尚未更新。
我的问题是为什么?我的思想错误在哪里? 代码如下:
public class BaseController : Controller
{
public string CurrentLanguage { get; set; }
public void UpdateLocalizationCookie(string languageCode)
{
var cookie = Request.Cookies["current_language"];
if (cookie != null)
{
cookie.Value = languageCode;
}
else
{
var newCookie = new HttpCookie("current_language", languageCode);
Response.AppendCookie(newCookie);
}
System.Threading.Thread.CurrentThread.CurrentCulture =
new System.Globalization.CultureInfo(languageCode);
System.Threading.Thread.CurrentThread.CurrentUICulture =
new System.Globalization.CultureInfo(languageCode);
CurrentLanguage = languageCode;
}
public void ReadLocalizationCookie(System.Web.Routing.RequestContext requestContext)
{
if (requestContext.HttpContext.Request != null)
{
var cookie = requestContext.HttpContext.Request.Cookies["current_language"];
if (cookie != null)
{
CurrentLanguage = cookie.Value;
return;
}
}
// Return default language code
CurrentLanguage = "nl-NL";
}
}
HomeController.cs
public class HomeController : BaseController
{
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
ReadLocalizationCookie(requestContext);
base.Initialize(requestContext);
}
public ActionResult ChangeLanguage(string language)
{
UpdateLocalizationCookie(language);
return Redirect(Request.UrlReferrer.ToString());
}
public async Task<ActionResult> Index()
{
HomePageModel viewModel = await _homeRepository.GetHomepage(CurrentLanguage);
viewModel.LatestNewsPanel.NewsItems = await _newsRepository.GetAllNews(CurrentLanguage);
SetMetadata(viewModel.Metadata);
ViewBag.Menu = Resources.Menu.Home;
return View(viewModel);
}