在基本控制器中更新的属性不会在主控制器(派生类)中更新

时间:2019-03-04 13:55:02

标签: c# .net asp.net-mvc cookies

我正在使用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);
}

0 个答案:

没有答案