缓存控制器操作如果线程正在更改



如果网站的本地化是以这样的方式完成的,那么在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文件中),并添加将返回您当前文化的逻辑

最新更新