ViewComponent не найден после обновления Monorail с v1.0.3 до v2.1RC - PullRequest
3 голосов
/ 16 июня 2011

Я использую монорельс в своем веб-приложении на C #.Поскольку я обновил его (.Net Framework 2 до 4 и Monorail 1.0.3 до 2.1RC), мой класс ViewComponent не найден.Все мои контроллеры работают нормально.Я использую nVelocity View Engine.Я не использую Виндзор, но, может быть, теперь я предполагаю, чтобы зарегистрировать его определенным образом?

В файле .vm я экспериментировал со следующими строками (без успеха первый работал до того, какобновил проект):

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

Кто-нибудь экспериментировал с этим?

Полное сообщение об ошибке:

ViewComponent 'MenuComponent' не найден.Это было зарегистрировано?Если вы включили Windsor Integration, то, скорее всего, вы забыли зарегистрировать компонент представления как компонент Windsor.Если вы уверены, что сделали это, убедитесь, что используемое имя является идентификатором компонента или ключом, переданным ViewComponentDetailsAttribute

Большое спасибо!

Ответы [ 2 ]

1 голос
/ 20 июня 2011

Я наконец нашел ключ к моей проблеме.Я использовал исходный код «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 */
}
0 голосов
/ 22 августа 2012

Мне любопытно, без вашего исправления, если вы переименуете MenuComponent просто в Menu, это работает?

...