2013-12-16 13 views
8

Ho creato un progetto MVC modulare per caricare altri progetti Web speciali nello stesso runtime.MVC: la vista trovata in "~ /.../ Index.cshtml" non è stata creata

Altri progetti si trovano in una cartella nella radice del sito Web denominata "Moduli". Sto utilizzando l'attributo PreApplicationStartMethod per caricare gli altri gruppi all'interno delle sottodirectory all'avvio.

Ho aggiunto percorsi speciali per indirizzare ciascun modulo con i vincoli dello spazio dei nomi.

devo creare una classe che implementa RazorViewEngine eseguire l'override del viewPath quando viene effettuata una chiamata per l'elemento nel modulo: ~/Vista/Home/Index.cshtml -> ~/Moduli/ModuleTest/Vista /Home/Index.cshtml.

Il Index() metodo all'interno della libreria a caricamento dinamico si chiama successo, ma ho ottenuto un errore quando la vista è resa:

Vedi seguente immagine: http://i.imgur.com/KoTgxg2.png

Il quadro mi dicono in sostanza che il la vista è stata trovata ma non la renderà. Qualcuno ha idea del perché il framework si rifiuti di renderlo?

Errore server nell'applicazione '/'.

La vista trovata in "~/Modules/ModuleTest/Views/Home/Index.cshtml" non è stata creata.

Descrizione: si è verificata un'eccezione non gestita durante l'esecuzione della richiesta Web corrente. Si prega di rivedere la traccia dello stack per ulteriori informazioni sull'errore e sulla sua origine nel codice.

Dettagli eccezione: System.InvalidOperationException: la vista trovata in "~/Modules/ModuleTest/Views/Home/Index.cshtml" non è stata creata.

  • Eccezione
 
Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 

Stack Trace: 

[InvalidOperationException: The view found at '~/Modules/ModuleTest/Views/Home/Index.cshtml' was not created.] 
    System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +362 
    System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +431 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +39 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +116 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +529 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +106 
    System.Web.Mvc.Async.c__DisplayClass28.b__19() +321 
    System.Web.Mvc.Async.c__DisplayClass1e.b__1b(IAsyncResult asyncResult) +185 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +42 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +133 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +56 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +40 
    System.Web.Mvc.Controller.b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +34 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +44 
    System.Web.Mvc.Controller.b__15(IAsyncResult asyncResult, Controller controller) +39 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +62 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +39 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +39 
    System.Web.Mvc.MvcHandler.b__4(IAsyncResult asyncResult, ProcessRequestState innerState) +39 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +70 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +139 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +59 
    System.Web.Mvc.Async.AsyncResultWrapper.End(IAsyncResult asyncResult, Object tag) +40 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +40 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +38 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9514812 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.18408 
  • controller

    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(new TestModel() { Value = "Bla" }); 
     } 
    } 
  • View
 

    @using Easily.ModuleTest.Models; 
    @{ ViewBag.Title = "Test Index"; } 
    @model TestModel 
    @Model.Value 

  • CustomRazorViewEngine

    public class CustomRazorViewEngine : RazorViewEngine 
    { 
     public CustomRazorViewEngine() 
     { 
      List tmpViewLocationFormats = new List(ViewLocationFormats); 
      List tmpMasterLocationFormats = new List(MasterLocationFormats); 
      List tmpPartialViewLocationFormats = new List(PartialViewLocationFormats); 
      foreach (string moduleDirectory in EasilyModulesContainer.Modules.Select(x => x.Directory)) 
      { 
       foreach (string viewLocationFormat in ViewLocationFormats) 
        tmpViewLocationFormats.Add(viewLocationFormat.Replace("~/", string.Format("~/{0}/{1}/", Constants.ModulesDirectory, moduleDirectory))); 
       foreach (string masterLocationFormat in MasterLocationFormats) 
        tmpMasterLocationFormats.Add(masterLocationFormat.Replace("~/", string.Format("~/{0}/{1}/", Constants.ModulesDirectory, moduleDirectory))); 
       foreach (string partialViewLocationFormat in PartialViewLocationFormats) 
        tmpPartialViewLocationFormats.Add(partialViewLocationFormat.Replace("~/", string.Format("~/{0}/{1}/", Constants.ModulesDirectory, moduleDirectory))); 
      } 
      ViewLocationFormats = tmpViewLocationFormats.ToArray(); 
      MasterLocationFormats = tmpMasterLocationFormats.ToArray(); 
      PartialViewLocationFormats = tmpPartialViewLocationFormats.ToArray(); 
     } 

     protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath) 
     { 
      return base.CreateView(controllerContext, GetPath(controllerContext, viewPath), masterPath); 
     } 

     protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath) 
     { 
      return base.CreatePartialView(controllerContext, GetPath(controllerContext, partialPath)); 
     } 

     private string GetPath(ControllerContext controllerContext, string path) 
     { 
      if (!controllerContext.RouteData.Values.ContainsKey("_module")) 
       return path; 
      Module module = ModulesContainer.Modules.SingleOrDefault(x => x.Name == controllerContext.RouteData.GetRequiredString("_module")); 
      return path.Replace("~/", string.Format("~/{0}/{1}/", Constants.ModulesDirectory, module.Directory)); 
     } 
    } 
+0

è il tuo punto di vista privo di errori? –

+0

Qual è la modalità di compilazione? La modifica di compilationMode = "Always" help? –

+0

Ho provato questo, ma non modifica nulla, purtroppo – Lex2193

risposta

8

Ho trovato il problema di debug in http://aspnetwebstack.codeplex.com/.

Attualmente carico la libreria che contiene i controller da un'altra cartella piuttosto che bin nella mia classe ModulesContainer (vedere la domanda).Ma dentro System.Web.Mvc.dll, un metodo cercare di trovare il mio tipo di controller facendo una Assembly.Load() nella directory predefinita, il suo motivo per cui la BuildManager.GetCompiledType() ritorno nulla.

ho trovato un modo semplice per eseguire l'override questo metodo con:

AppDomain.CurrentDomain.AssemblyResolve += CurrentDomainAssemblyResolve;

e

private static Assembly CurrentDomainAssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     if (args.RequestingAssembly != null) 
      return args.RequestingAssembly; 
     Module module = _modules.SingleOrDefault(x => x.Assembly.FullName == args.Name); 
     if (module != null) 
      return module.Assembly; 
     throw new Exception(string.Format("Unable to load assembly {0}", args.Name)); 
    }

Sto solo cercando all'interno della mia cache di dll pre-costruito per trova il gruppo già caricato.

+2

Questo sembra utile, ma dove è definita e popolata la variabile _modules? – Jeremy

0

@ Lex2193: Ho trovato problema nella vostra risposta. quando stavo usando il codice stava funzionando bene tranne per la situazione in cui assembly di riferimento ha un altro di riferimento da cui dipende:

Module [M] => Dependency [D] => DeepDependency [DD] 

Quando si utilizza in oggetto modulo da [D], che ha in sé alcune chiamate a qualcosa in [DD]. Fallirà sull'eccezione TypeLoad. A causa della richiesta di assemblaggio. Così ho modificato il codice al primo modulo di ricerca per il modulo:

public static Assembly CurrentDomainAssemblyResolve(object sender, ResolveEventArgs args) 
{ 
    Assembly module = modules.SingleOrDefault(x => x.FullName == args.Name); 
    if (module != null) 
     return module; 

    if (args.RequestingAssembly != null) 
     return args.RequestingAssembly; 

    throw new Exception(string.Format("Could not load file or assembly {0}", args.Name)); 
} 
Problemi correlati