我正在使用 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/