asp.net-mvc - 将缓存对象公开给 View 的最佳方法

标签 asp.net-mvc caching razor view

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

我当前对 Translator 对象的使用是:

  • 我有一个 MasterViewModel

    public class MasterViewModel
    {
        public Translator Translator = HttpContext.Current.Cache.Get("Translator") as   Translator;
    }
    
  • 每个 View 都有一个 View 模型,它是 MasterViewModel 固有的

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

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

我认为这不是一个好的方法。 在App_Code中制作一个 Razor 助手是个好主意吗?这样在我看来我可以使用

    @Translate.GetText("RANDOM_TEXT")

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

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

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

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

最佳答案

有多种方法可以实现这一目标,但我将通过从 WebViewPage 派生来创建一个基类,并强制所有 razor View 都从该类继承。

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

现在我可以通过几种方式继承 razor View 中的 MyWebViewPage:

第一种方法是在每个 View 中都必须使用 @inherits 指令。

例如。

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

....

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

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

<pages pageBaseType="MyWebViewPageBase">

现在,从任何 View ,您都可以简单地调用翻译方法,如下所示,

@Translate("RANDOM_TEXT")

希望这有帮助!

关于asp.net-mvc - 将缓存对象公开给 View 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10945840/

相关文章:

c# - DisplayNameFor 用于从 IEnumerable<T> 派生的接口(interface)

c# - Azure B2C 拒绝 asp.net MVC 中的 ="?"

c# - ASP.NET MVC5 中如何通知用户提交的文件太大?

asp.net-mvc 和 webforms 共存

python - 如何 : Pyspark dataframe persist usage and reading-back

php - mod_php APC 被符号链接(symbolic link)混淆,包含相同的文件两次 - 为什么?

python - 在网站上运行 Python 脚本(在后台)

angularjs - 在 ASP.NET MVC 中使用带有 TextBoxFor 的 Angular 属性

jquery - 验证动态添加的控件

css - Orchard 自定义主题未被拾取