如果网站的本地化是以这样的方式完成的,那么在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()
{}
然后我失去了切换语言能力。
您可以通过自定义参数
来缓存 [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);
}
现在,您的outputcache正在根据用户当前的UI文化来缓存您的视图。
如果您的控制器上有多个varybyCustom属性,则需要使用Aditional逻辑来增强该方法。
参考: https://msdn.microsoft.com/en-us/library/5ecf4420.aspx
在outputcache属性中使用varybycustom属性
[OutputCache(VaryByCustom = "CultureCode")]
您也可以在httpapplication类中覆盖getvaryByCustomString(httpcontext上下文,字符串自定义)(在您的global.asax.cs文件中),并添加将返回您当前文化的逻辑