ASP.NET MVC Html.RenderAction方法

时间:2010-11-01 13:16:35

标签: c# asp.net-mvc inversion-of-control castle-windsor

我尝试使用这样的方法:

<%Html.RenderAction<NavigatorController>(n => n.Menu());%>

但有一个例外“在控制器'WebUI.Controllers.ProductsController'上找不到公共操作方法'Menu'。为什么编译器试图在ProductsController中找到它,如果我为此目的指定NavigatorController? 我的NavigatorController中的代码非常简单:

namespace WebUI.Controllers
{
    public class NavigatorController : Controller
    {
        public string Menu()
        {
            return "NavigatorController here";
        }
    }
}

P.S。我使用ASP.NET MVC Features库中的RenderAction。

我解决了这个问题。由于@jfar提到错误是别的,错误在我的自定义控制器工厂模块中,我使用Castle.Windsor库编写,我试图在Steven Sanderson书(Pro ASP.NET MVC Framework)中实现控件的反转。所以,我注册所有控制器类型的方法是:

    _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));
                IEnumerable<Type> controllerTypes = from type in Assembly.GetExecutingAssembly().GetTypes()
                                                    where typeof(IController).IsAssignableFrom(type)
                                                    select type;

container.Register(Component.For(controllerTypes).LifeStyle.Is(LifestyleType.Transient));

阅读完一篇文章后,我将其替换为:

_container.Register(AllTypes.FromAssembly(Assembly.GetExecutingAssembly())
                .BasedOn<Controller>()
                .Configure(c => c.LifeStyle.Transient.Named(c.Implementation.Name.ToLower())));

现在一切正常

3 个答案:

答案 0 :(得分:1)

您可以在视图中使用以下语句。

<% Html.RenderAction("Menu", "Navigator"); %>

答案 1 :(得分:1)

此错误必须在其他地方发生。

<%Html.RenderAction<NavigatorController>(n => n.Menu());%>

此代码将始终使用NavigationController。

答案 2 :(得分:0)

像普法尔说的那样:

  

此错误必须在其他地方发生。

检查您的路线。

我的猜测是你修改了你的路线,它总是为ProductsController选择一个。