2017-02-26 33 views
1

如果网站的本地化是这样完成的,即对mvc控制器中的每个请求都读取当前线程,并在该信息上加载部分视图(导致每种语言都有不同的局部视图)以及非局部视图内的字符串使用资源字符串进行本地化使用数据标注设置本地化的自定义属性如果线程正在改变,缓存控制器动作

[Localize] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     string partialView = string.Empty; 
     switch (Thread.CurrentThread.CurrentCulture.ToString()) 
     { 
      case "en-US": 
      partialView = "english"; 
      .... 
     } 
     ViewBag.PartialViewName = partialView; 
     return View(); 
    } 
} 

我的问题

控制器是:我怎么能缓存这个Index行动明知有 有7种不同的语言?

更新: 如果我使用例如

[OutputCache(Duration = 300)] 
public ActionResult Index() 
{} 

然后我失去切换语言的能力。

+0

否则你如何缓存? – DavidG

回答

3

你可以只通过一个自定义的参数缓存

[OutputCache(Duration = 3600, VaryByCustom = "CurCulture")] 

在你的项目的global.asax.cs添加以下内容:基于用户当前

public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
    if (arg.Equals("CurCulture")) 
    { 
     var culture = Thread.CurrentThread.CurrentUICulture; 
     return culture; 
    } 

    return base.GetVaryByCustomString(context, arg); 
} 

现在你的输出缓存是缓存您的意见UI文化。

如果您的控制器中有多个VaryByCustom属性,则需要使用aditional逻辑来增强该方法。

参考:https://msdn.microsoft.com/en-us/library/5ecf4420.aspx

1

中的OutputCache使用VaryByCustom是财产在你的Global.asax属性

[OutputCache(VaryByCustom = "CultureCode")] 

您也可以在HttpApplication类重写GetVaryByCustomString(HttpContext的背景下,自定义字符串)(左右。 cs文件),并添加逻辑,将返回您当前的文化