我正在使用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);
}
所以我的问题是将缓存对象暴露给我的所有视图的最佳方法是什么。 以上方法之一是好的吗?或者我应该采用其他解决方案?
(我希望我的英语好,我是荷兰人)
答案 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")
希望这有帮助!