【问题标题】:ViewComponent not found after upgrading Monorail from v1.0.3 to v2.1RC将 Monorail 从 v1.0.3 升级到 v2.1RC 后找不到 ViewComponent
【发布时间】:2026-02-03 15:25:01
【问题描述】:

我在我的 C# Web 应用程序中使用 Monorail。由于我升级了它(.Net Framework 2 到 4 和 Monorail 1.0.3 到 2.1RC),我的 ViewComponent 类没有找到。我所有的控制器似乎都工作正常。我正在使用 nVelocity 视图引擎。我没有使用 Windsor,但也许现在我想以某种方式注册它?

在 .vm 文件中,我尝试了以下几行(没有成功,第一个在我升级项目之前正在工作):

 #component(MenuComponent)
 #component(MenuComponent with "role=admins")
 #blockcomponent(MenuComponent with "role=admins")

有人做过实验吗?

完整的错误信息是:

ViewComponent 'MenuComponent' 可以 找不到。被注册了吗?如果 您已启用温莎集成, 那么很可能你已经忘记了 将视图组件注册为 温莎组件。如果你确定你 做到了,然后确保使用的名称 是组件id还是传递的key 查看ComponentDetailsAttribute

非常感谢!

【问题讨论】:

  • 如何在温莎注册?
  • 对不起jishi,我没有用Windsor,所以帮不了你。也许您可以在该代码示例中找到一些线索:groups.google.com/group/castle-project-users/browse_thread/…
  • 那么如何注册组件和控制器呢?我不是在找我,我是为了帮助你。
  • 好的,谢谢!我只是没有注册它,我认为它是“自动的”,就像以前版本的 Monorail 一样,我更新的修复它的代码似乎证实了这一点。我刚刚在配置文件中指定了我的程序集: MyAssemblyName

标签: castle-monorail nvelocity


【解决方案1】:

我终于找到了解决问题的线索。我使用“Castle.Monorail.Framework.dll”源代码来查看内部发生了什么:似乎在 Web.Config 文件中指定的程序集(在<Controllers> 甚至在<viewcomponents> 中)没有像它们一样被“检查”应该是因为包含它的变量初始化太晚了。

我构建了一个新版本的 dll,现在它工作正常。我会将我的“固定”代码提交给 Castle Project 社区,以确保它不是其他原因(如错误设置)的结果。

直到这是我的“修复”,我只是移动了一部分代码。你可以在这里找到原始源代码:http://www.symbolsource.org/Public/Metadata/Default/Project/Castle/1.0-RC3/Debug/All/Castle.MonoRail.Framework/Castle.MonoRail.Framework/Services/DefaultViewComponentFactory.cs

*Assembly:* Castle.MonoRail.Framework
*Class:* Castle.MonoRail.Framework.Services.**DefaultViewComponentFactory**


public override void Service(IServiceProvider provider)
{
  /* Here is the section I moved */
  var config = (IMonoRailConfiguration)provider.GetService(typeof(IMonoRailConfiguration));
  if (config != null)
  {
    assemblies = config.ViewComponentsConfig.Assemblies;
    if (assemblies == null || assemblies.Length == 0)
    {
      // Convention: uses the controller assemblies in this case
      assemblies = config.ControllersConfig.Assemblies.ToArray();
    }
  }
  /*******************************/

  base.Service(provider); // Assemblies inspection is done there

  var loggerFactory = (ILoggerFactory) provider.GetService(typeof(ILoggerFactory));
  if (loggerFactory != null)
  {
    logger = loggerFactory.Create(typeof(DefaultViewComponentFactory));
  }
  /* The moved section was here */
}

【讨论】:

    【解决方案2】:

    我很好奇,如果没有您的修复,如果您将 MenuComponent 重命名为 Menu,它会起作用吗?

    【讨论】:

      最近更新 更多