【发布时间】:2010-11-02 14:59:33
【问题描述】:
我尝试使用类似这样的方法:
<%Html.RenderAction<NavigatorController>(n => n.Menu());%>
但出现异常“在控制器 'WebUI.Controllers.ProductsController' 上找不到公共操作方法 'Menu'。如果我为此目的指定 NavigatorController,为什么编译器会尝试在 ProductsController 中找到它? 我的 NavigatorController 中的代码非常简单:
namespace WebUI.Controllers
{
public class NavigatorController : Controller
{
public string Menu()
{
return "NavigatorController here";
}
}
}
附:我使用 ASP.NET MVC 功能库中的 RenderAction。
我解决了这个问题。正如@jfar 提到的错误是别的东西,错误出现在我使用 Castle.Windsor 库编写的自定义控制器工厂模块中,我尝试实现 Steven Sanderson 书中描述的控制反转(Pro ASP.NET MVC Framework)。所以,我注册所有 Controller 类型的方法是:
_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())));
现在一切正常
【问题讨论】:
-
您能发布您的路线配置吗?听起来问题可能就在那里。
-
您可以将
AllTypes.FromAssembly(Assembly.GetExecutingAssembly()替换为AllTypes.FromThisAssembly()参见文档stw.castleproject.org/…
标签: c# asp.net-mvc inversion-of-control castle-windsor