我在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
非常感谢!
答案 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,它有效吗?