【问题标题】:Custom Razor View Base class and dependency injection自定义 Razor View 基类和依赖注入
【发布时间】:2011-06-15 06:02:44
【问题描述】:

我有一个自定义 razor 视图基类,它有一个依赖于本地化的服务的属性,该服务通过属性注入被 Unity 注入。

如果我在视图中使用该属性,则该属性已正确解析。但是,如果我尝试在布局(母版页)中使用相同的属性,则该属性尚未设置。

在 Unity 尝试解析视图并注入依赖项之前,谁能解释一下视图是如何渲染和编译的。

我正在尝试使用约定 [ViewName.Title] 设置每个视图的标题,并进行本地化服务查找,这在视图上效果很好,但我不想在每个视图中重复它。我有一种将逻辑移至 _ViewStart.cshtml 的感觉,但 ViewBag 或我的本地化服务在那里不可用。

基类:

public abstract class LocalizeBaseWebViewPage<TModel> : WebViewPage<TModel>
{
    [Microsoft.Practices.Unity.Dependency]
    public ILocalizationService LocalizationService { get; set; }

    public virtual string Localize(string key)
    {
        return LocalizationService.GetResource(key);
    }
}

这适用于 Index.cshtml

@{
    ViewBag.Title = Localize("Title");
    Layout = "~/Views/Shared/_Layout.cshtml";
}

但不在 _Layout.cshtml 中,因为没有为服务设置对象引用。

@{
    ViewBag.Title = Localize("Title");
}

【问题讨论】:

  • 向我们展示您的属性在 razor 基类中的外观以及母版页中的用途。
  • 您能否在控制器中执行此操作,并让您发送到视图的视图模型 dto(或 ViewBag 属性)已经本地化?
  • @Charlino 我不确定我是否理解,但问题似乎是布局页面在从容器生成完整视图之前执行。

标签: asp.net-mvc-3 razor unity-container


【解决方案1】:

依赖注入在设计时在 asp.net mvc 3 布局页面中不起作用(这意味着母版页 DI 中的 BaseView 也不起作用)。因此,您可以通过UnityContainer 为布局页面解析您的LocalizationService(因此您需要将Container 存储在HttpApplication 中并访问Container 以通过它解决依赖关系)。

ActionFilters 依赖项中的 BTW 也不起作用..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2014-01-30
    • 2013-07-14
    • 1970-01-01
    相关资源
    最近更新 更多