将Monorail从v1.0.3升级到v2.1RC后未找到ViewComponent

时间:2011-06-16 13:36:16

标签: castle-monorail nvelocity

我在C#网络应用程序中使用Monorail。自从我升级它(.Net Framework 2到4和Monorail 1.0.3到2.1RC)后,找不到我的ViewComponent类。我的所有控制器似乎工作正常。我正在使用nVelocity View Engine。我不是在使用Windsor,但也许现在我想以某种方式注册它?

在.vm文件中,我尝试了以下几行(没有成功,第一个在升级项目之前就已经开始了):

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

有人试过吗?

完整的错误消息是:

  

ViewComponent'MenuComponent'可以   找不到。它被注册了吗?如果   你启用了Windsor Integration,   那么你可能已经忘记了   将视图组件注册为   温莎组件。如果你确定你   做了,然后确保使用的名称   是组件ID或传递的密钥   到ViewComponentDetailsAttribute

非常感谢!

2 个答案:

答案 0 :(得分: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 */
}

答案 1 :(得分:0)

我很好奇,没有你的修复,如果你将MenuComponent重命名为Menu,它有效吗?