缓存页面取决于所选语言

时间:2014-02-07 21:24:52

标签: .net asp.net-mvc asp.net-mvc-4

我有mvc4应用程序,有两种语言版本。

现在我有缓存问题,我尝试使用输出缓存,如

[OutputCache(Duration = 3600, VaryByHeader="Accept-Language")]
public ActionResult Home() {...}

但这没有解决任何问题,页面被缓存,当我更改语言时没有任何反应,之前缓存的页面仍然保留,直到缓存过期。我不确定此VaryByHeader="Accept-Language是否符合我的网页本地化设置。

当用户点击语言标志时,一些整数值(表示当前语言)存储在cookie中,并调用helper来读取cookie并使用Thread.CurrentThread.CurrentUICulture = ...设置相应的语言

所以如何根据选定的语言缓存页面,如果它有任何值只有两种语言。

2 个答案:

答案 0 :(得分:1)

您需要为该语言的OutputCache添加自定义参数才能使其正常工作。

查看this blog post,该工作可以很好地解释流程,特别是OutputCache and Localization部分。

博客文章虽然面向MVC2,但它也应该适用于MVC4。

答案 1 :(得分:0)

覆盖GetVaryByCustomString中的global.asax.cs

public override string GetVaryByCustomString(HttpContext context, string value)
{
     if (value.Equals("lang"))
     {
         return Thread.CurrentThread.CurrentUICulture.Name;
     }
     return base.GetVaryByCustomString(context,value);
}

现在将您的OutputCache写在Action上,如下面的代码:

[OutputCache(Duration=3600,VaryByParam="none", VaryByCustom="lang")]
public ActionResult Index()
{
     // My Codes .... ;)
     return View();
}
  

注意:   在我的情况下,我已经在自定义ControllerFactory课程中编写了设置语言代码,并且 {{1方法(在之后触发)并且此问题在缓存中导致失败基于Action中用户选择的语言。因此,我将设置语言代码移至GetVaryByCustomString文件中的 Application_BeginRequest 方法,现在可以正常工作。

  

我根据@DimitryKhaykin在答案中提到的link写了这个答案,在答案中写了答案。