Asp.net mvc 2 如何为ASP.NET MVC2母版页提供与控制器模型无关的更新

Asp.net mvc 2 如何为ASP.NET MVC2母版页提供与控制器模型无关的更新,asp.net-mvc-2,dependency-injection,master-pages,ioc-container,Asp.net Mvc 2,Dependency Injection,Master Pages,Ioc Container,我在ASP.NET MVC2下使用强类型视图和autofac进行依赖项注入,并试图通过依赖项注入获得一个通用的动态头。也就是说,我希望这种情况发生时,视图不必离开此内容,甚至不存在,我希望避免容器的静态发现和手动解析,但我找不到通过ctor或属性注入轻松注入主视图或主视图中包含的部分视图的方法 我无法想象这是一个不寻常的任务,但我能找到的方法是控制器子类化,将数据填充到非类型化的ViewData中,将ViewModels子类化,将主数据填充到模型中,或者静态解析,所有这些我都不希望使用。我忽略了

我在ASP.NET MVC2下使用强类型视图和autofac进行依赖项注入,并试图通过依赖项注入获得一个通用的动态头。也就是说,我希望这种情况发生时,视图不必离开此内容,甚至不存在,我希望避免容器的静态发现和手动解析,但我找不到通过ctor或属性注入轻松注入主视图或主视图中包含的部分视图的方法

我无法想象这是一个不寻常的任务,但我能找到的方法是控制器子类化,将数据填充到非类型化的ViewData中,将ViewModels子类化,将主数据填充到模型中,或者静态解析,所有这些我都不希望使用。我忽略了什么

编辑:正如已经指出的那样,DI进入母版页是在与框架作斗争。所以我的问题很糟糕:我真的不关心母版页的DI,但我在网站的chrome中有一个动态元素,即母版页。为它提供一个模型不应该是使用该主机的每个控制器的责任,因为它是请求上下文,而不是特定于控制器上下文。我完全承认直接注入母版页是不合适的。如果我可以另外注册一个单独的主控制器来调用,那就更好了。可能吗?考虑到为主机提供独立于控制器的模型的任务,什么是适合框架的方法?或者MVC中的共享内容是否要求每个控制器都必须知道该内容?

您可以使用

控制器:

public class MyHeaderController: Controller
{
    private readony IRepository _repository;
    public MyHeaderController(IRepository repository)
    {
        _repository = repository;
    }

    [ChildActionOnly]
    public ActionResult Index() 
    {
        var model = _repository.GetSomeModel();
        return PartialView(model);
    }
}
在母版页的某个地方包括:

<div><%= Html.Action("Index", "MyHeader") %></div>

您的问题源于混淆术语依赖注入,以及与ASP.NET MVC框架的工作方式发生冲突

此外,您在错误的上下文中使用了术语依赖注入。你想用锤子当凿子

ASP.NET MVC中的母版页和视图旨在用作模板。如另一个答案所述,儿童行动将解决您的问题

供日后参考:

依赖项注入指的是一种配置要注入类构造函数的参数的方法,它可以自动为您完成,覆盖一些框架默认值。这样做的目的是分离组件,使它们变得更可重用、更可测试、更统一,以及其他一些好东西

DI是指并解决代码问题,而不是UI问题

你想做的是根本不可能的。即,通过构造函数和属性将“依赖项”注入母版页。同样,ASP.NET MVC打算将母版页用作模板。它们没有代码隐藏类,可以通过允许将依赖项注入其中的构造函数进行实例化

换句话说,您正在与框架作斗争,这意味着您不理解它


如果这听起来像是吹毛求疵,我认为必须强调这一点,否则,你会让你自己和将来阅读这篇文章的其他人感到困惑。

请参见下面我的答案,但总而言之,你试图用锤子作为凿子。您正在与ASP.NET MVC框架作斗争,并试图使其更像webforms。是的,您试图用错误的工具解决问题的错误端:(阿恩,我认为这是一个好问题——这正是您在试图解决此问题时搜索的内容。(MVC3显然也支持这一点;)我对ChildActionOnly的问题是,它将责任放在每个控制器上,或者迫使我使用控制器基类。我希望主控的ViewModel独立于控制器,因为它是chrome的一部分,而不是控制器的一部分behavior@Arne,我认为你误解了儿童行为的目的。它们将控制器与渲染视图的主控制器完全分离。渲染子动作的控制器的视图模型与渲染视图的主控制器中使用的视图模型完全独立,因为它们是两个不同的控制器。你仍然可以用与主控制器相同的方式将DI引入子动作控制器。谢谢你的澄清。看来我只看错了孩子。我认为ChildAction只需要在每个控制器中定义。一个独立的控制器正是我想要的。但事实上,MVC母版页就像ASP.NET中的任何其他动态视图一样是代码。不要让框架当前支持的内容被误认为是最佳实践,它是在推动框架的局限性,从而使其得到改进:)。。。然而,儿童行动在这里是一个非常好的解决方案。