Domanda

Sto usando la monorotaia nella mia applicazione Web C#. Da quando l'ho aumentato (.NET Framework 2 a 4 e Monorail da 1.0.3 a 2.1RC), la mia classe ViewComponent non è stata trovata. Tutti i miei controller sembrano funzionare bene. Sto usando il motore Nvelocity View. Non sto usando Windsor, ma forse ora suppongo di registrarlo in un certo modo?

Nel file .vm, ho sperimentato le seguenti righe (senza successo, la prima era funzionante prima di aggiornare il progetto):

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

Qualcuno l'ha sperimentato?

Il messaggio di errore completo è:

Non è stato possibile trovare "menuggrezza" di visualizzazione. Era registrato? Se hai abilitato l'integrazione di Windsor, è probabile che tu abbia dimenticato di registrare il componente Visualizza come componente Windsor. Se sei sicuro di averlo fatto, assicurati che il nome utilizzato sia l'ID componente o il tasto passato a ViewComponentDetailSattribute

Grazie molto!

È stato utile?

Soluzione

Alla fine ho trovato un indizio sul mio problema. Ho usato il codice sorgente 'Castle.Monorail.framework.dll' per vedere cosa succede all'interno: sembra che gli assiemi specificati nel file web.config (in <Controllers> o anche dentro <viewcomponents>) non sono "ispezionati" come dovrebbero essere perché la variabile che contiene è inizializzata troppo tardi.

Ho costruito una nuova versione della DLL e ora funziona bene. Invierò il mio codice "fisso" alla comunità del progetto Castle per essere sicuro che non è la conseguenza di qualcos'altro (come le cattive impostazioni).

Finché ecco la mia "correzione", ho appena spostato una parte del codice. Puoi trovare il codice sorgente originale qui: http://www.symbolsource.org/public/metadata/default/project/castle/1.0-rc3/debug/all/castle.monorail.framework/castle.monorail.framework/services/defaultviewfactory.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 */
}

Altri suggerimenti

Sono curioso, senza la tua correzione, se rinomini il menugger solo per menu, funziona?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top