【问题标题】:ASP.NET MVC Html.RenderAction methodASP.NET MVC Html.RenderAction 方法
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我在成为使用 Html.RenderAction 之前使用此语句,但使用 Html.RenderAction("Menu", "Navigator");效果是一样的
  • @Kai 我正在使用 asp.net mvc 2,它在这里工作。你的 mvc 版本是多少?
  • 我正在使用带有 ASP.NET MVC 功能库的 ASP.NET MVC 1,我将其添加为我的项目的参考以使用 RenderAction 方法
【解决方案2】:

这个错误一定是在其他地方发生的。

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

此代码将始终使用 NavigationController。

【讨论】:

    【解决方案3】:

    就像jfar说的:

    这个错误一定发生在其他地方。

    检查您的路线。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多