如果线程正在改变,则缓存控制器动作

时间:2017-02-26 19:29:14

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

如果网站的本地化是以这样的方式完成的:在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()
{}
然后我失去了转换语言能力。

2 个答案:

答案 0 :(得分: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); 
}

现在,您的outputcache正在根据用户当前的ui-culture缓存您的视图。

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

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

答案 1 :(得分:1)

在OutputCache属性中使用VaryByCustom属性

[OutputCache(VaryByCustom = "CultureCode")]

此外,您可以在HttpApplication类中覆盖GetVaryByCustomString(HttpContext上下文,字符串自定义)(因此在您的Global.asax.cs文件中)并添加将返回当前文化的逻辑