Asp.net mvc 向视图公开缓存对象的最佳方法

Asp.net mvc 向视图公开缓存对象的最佳方法,asp.net-mvc,caching,razor,views,Asp.net Mvc,Caching,Razor,Views,我使用Translator对象(自定义类)公开网站文本(该对象存储数据库中的文本)。转换器对象存储在缓存中的Application_Start()函数中 我当前使用的Translator对象是: 我有一个MasterViewModel public class MasterViewModel { public Translator Translator = HttpContext.Current.Cache.Get("Translator") as Translator; }

我使用Translator对象(自定义类)公开网站文本(该对象存储数据库中的文本)。转换器对象存储在缓存中的Application_Start()函数中

我当前使用的Translator对象是:

  • 我有一个MasterViewModel

    public class MasterViewModel
    {
        public Translator Translator = HttpContext.Current.Cache.Get("Translator") as   Translator;
    }
    
  • 每个视图都有一个viewmodel,它继承了MasterViewModel

    public class RandomViewModel : MasterViewModel
    {
    }
    
  • 在我看来,我可以使用我的Translator对象

    @model ViewModels.RandomViewModel
    
    @Model.Translator.GetText(label)
    
我不认为这是一个好办法。 在App_代码中制作一个剃须刀助手,以便在我的视图中使用,这是一个好主意吗

    @Translate.GetText("RANDOM_TEXT")
这将是帮助函数(在Translate.cshtml中)

所以我的问题是,向所有视图公开缓存对象的最佳方式是什么。 上述方法之一好吗?或者我应该采用另一种解决方案


(我希望我的英语没问题,我是荷兰人)

有不同的方法可以实现这一点,但我将通过从
WebViewPage
派生来创建一个基类,并强制所有razor视图继承自该类

public abstract class MyWebViewPageBase<T>: WebViewPage<T>
{
   private Translator _translator;

   protected override void InitializePage()
   { 
     _translator = Context.Cache.Get("Translator") as Translator;
   }

   public string Translate(string label)
   {
     if(_translator != null)
       return _translator.GetText(label);

     return "";
   }
}
另一种方法是全局设置所有视图的基本页面,为此,您必须修改
视图
文件夹中的web.config

您必须如下设置
pages
元素的
pageBaseType

<pages pageBaseType="MyWebViewPageBase">
@Translate("RANDOM_TEXT")
希望这有帮助

<pages pageBaseType="MyWebViewPageBase">
@Translate("RANDOM_TEXT")