3

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

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

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

有人做过实验吗?

完整的错误信息是:

找不到 ViewComponent“菜单组件”。被注册了吗?如果您启用了 Windsor 集成,那么您很可能忘记将视图组件注册为 Windsor 组件。如果你确定你做了,那么确保使用的名称是组件 id 或传递给 ViewComponentDetailsAttribute 的键

非常感谢!

4

2 回答 2

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 */
}
于 2011-06-20T15:36:52.220 回答
0

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

于 2012-08-21T22:40:21.253 回答