2

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

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

  • 我有一个 MasterViewModel

    public class MasterViewModel
    {
        public Translator Translator = HttpContext.Current.Cache.Get("Translator") as   Translator;
    }
    
  • 每个视图都有一个视图模型,它来自 MasterViewModel

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

    @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);
    }

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

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

4

1 回答 1

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现在我可以通过以下几种方式继承in razor 视图:

第一种方法是从你必须使用@inherits指令的每个角度来看。

前任。

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

....

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

您必须如下设置pageBaseTypeofpages元素,

<pages pageBaseType="MyWebViewPageBase">

现在从任何角度来看,您都可以简单地调用 translate 方法,如下所示,

@Translate("RANDOM_TEXT")

希望这可以帮助!

于 2012-06-08T10:23:04.863 回答