将缓存对象公开给视图的最佳方法

时间:2012-06-08 08:59:28

标签: asp.net-mvc caching razor views

我正在使用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
    {
    }
    
  • 在我的观看中,我可以使用我的翻译对象

    @model ViewModels.RandomViewModel
    
    @Model.Translator.GetText(label)
    

我不认为这是一个很好的方法。 在App_Code中创建一个剃刀助手是一个好主意,所以在我的视图中我可以使用

    @Translate.GetText("RANDOM_TEXT")

这将是Helper函数(在Translate.cshtml中)

    @helper GetText(string label)
    {
        Translator Translator = @Cache.Get("Translator") as Translator;
        @: Translator.GetTextByLabel(label);
    }

所以我的问题是将缓存对象暴露给我的所有视图的最佳方法是什么。 以上方法之一是好的吗?或者我应该采用其他解决方案?

(我希望我的英语好,我是荷兰人)

1 个答案:

答案 0 :(得分:2)

您可以通过不同的方式实现这一目标,但我将通过派生WebViewPage来创建基类,并强制从此类继承所有剃刀视图。

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 "";
   }
}

现在我可以通过几种方式继承剃刀视图中的MyWebViewPage

第一种方法是从每个视图中使用@inherits指令。

实施例

// Index.cshtml
@inherits MyWebViewPageBase
@model ...

....

另一种方法是为所有视图设置基页的全局方法,因此您必须修改Views文件夹中存在的web.config。

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

<pages pageBaseType="MyWebViewPageBase">

现在,您可以从任何视图调用如下的translate方法,

@Translate("RANDOM_TEXT")

希望这有帮助!