2011-06-02 28 views
7

我有一个自定义剃须刀视图基类,具有本地化依赖服务的属性,它通过属性注入与Unity注入。自定义Razor查看基类和依赖项注入

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

有人可以解释在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"); 
} 
+0

告诉我们如何做你的财产在剃刀基类的样子,并在母版页中使用。 – Eduard 2011-06-02 11:08:31

+0

你可以在你的控制器中做到这一点,并有发送到已经本地化的视图的视图模型dto(或ViewBag属性)? – Charlino 2011-06-14 21:25:56

+0

@Charlino我不知道我是否理解,但问题似乎是在从容器生成完整视图之前执行Layout页面。 – adriaanp 2011-06-16 08:51:53

回答

2

依赖注入不按设计asp.net的MVC 3布局页的工作(那意味着,在母版页DI基本视点不也可以)。因此,您可以通过布局页面解析LocalizationServiceUnityContainer(因此您需要将容器存储在HttpApplication之内并访问Container以通过它解析依赖关系)。

BTW在ActionFilters依赖不也是工作..