2012-04-05 3 views
0

Ich habe versucht, einige der Code aus here und here, aber ich bekomme einen Fehler auf der Seite beim Versuch, die Remote-Ansicht in einem separaten Projekt verweisen: "Wert kann nicht null sein. Parameter name : stream "Pluggable MVC-Ansicht Null zurück

Unten ist mein AssemblyResourceProvider und Controller in meinem Master MVC 4-Projekt. Ich habe auch die ganze Lösung selbst beigefügt here. Kann jemand helfen zu sehen, was schief läuft? Danke für jede Hilfe oder Vorschläge.

public class AssemblyResourceProvider : System.Web.Hosting.VirtualPathProvider 
    { 
     private bool IsAppResourcePath(string virtualPath) 
     { 
      string checkPath = VirtualPathUtility.ToAppRelative(virtualPath); 
      return checkPath.StartsWith("~/Plugin/", StringComparison.InvariantCultureIgnoreCase); 
     } 

     public override bool FileExists(string virtualPath) 
     { 
      return IsAppResourcePath(virtualPath) || base.FileExists(virtualPath); 
     } 

     public override VirtualFile GetFile(string virtualPath) 
     { 
      return IsAppResourcePath(virtualPath) 
       ? new AssemblyResourceVirtualFile(virtualPath) 
       : base.GetFile(virtualPath); 
     } 

     public override CacheDependency GetCacheDependency(string virtualPath, IEnumerable virtualPathDependencies, DateTime utcStart) 
     { 
      return !IsAppResourcePath(virtualPath) 
       ? base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart) 
       : null; 
     } 
    } 

    public class AssemblyResourceVirtualFile : VirtualFile 
    { 
     string path; 

     public AssemblyResourceVirtualFile(string virtualPath) : base(virtualPath) 
     { 
      path = VirtualPathUtility.ToAppRelative(virtualPath); 
     } 

     public override Stream Open() 
     { 
      string[] parts = path.Split('/'); 
      string assemblyName = parts[2]; 
      string resourceName = parts[3]; 

      var assembly = Assembly.LoadFile(Path.Combine(HttpRuntime.BinDirectory, assemblyName)); 

      return assembly != null 
       ? assembly.GetManifestResourceStream(resourceName) 
       : null; 
     } 
    } 

Und mein Heimsteuerung:

public ActionResult Pluggable() 
{ 
    //ViewBag.Name = name; 
    return View("~/Plugin/PluginView1.dll/PluginView1.Views.Home.Pluggable.cshtml"); 
} 

enter image description here

+0

Ja, öffentliche Überschreibung Stream Open() kann die Assembly nicht finden und gibt einen Nullstream zurück, oder GetManifestResourceStream findet keine Ressource mit dem Namen. Dies kann passieren, wenn die cshtml-Datei nicht auf eine eingebettete Ressource eingestellt ist oder Ihr vollständiger Namespace falsch ist. –

+0

Ich habe daran gedacht, die Ressource einzubetten, und ich glaube, dass mein Namespace nach dem anderen Post korrekt ist. – TruMan1

+0

Haben Sie daran gedacht, die DLL in den Ordner Bin zu kopieren? oder wo sonst noch deine Plugins laden? –

Antwort

0

Hier ist meine AssemblyResourceVirtualFile, die ich in einem Projekt vor verwendet:

public class AssemblyResourceVirtualFile : VirtualFile 
{ 
    string path; 
    public AssemblyResourceVirtualFile(string virtualPath) : base(virtualPath) 
    { 
     path = VirtualPathUtility.ToAppRelative(virtualPath); 
    } 
    public override System.IO.Stream Open() 
    { 
     string[] parts = path.Split('/'); 
     string assemblyName = parts[2]; 
     string resourceName = parts[3]; 

     assemblyName = Path.Combine(HttpRuntime.BinDirectory, assemblyName); 

     System.Reflection.Assembly assembly = System.Reflection.Assembly.LoadFile(assemblyName); 
     if (assembly != null) 
     { 
      Stream resourceStream = assembly.GetManifestResourceStream(resourceName); 
      return resourceStream; 
     } 
     return null; 
    } 
} 

Wirklich der einzige Unterschied ist, I‘ Ich habe es so gemacht, dass du dort Breakpoints einkleben und laufen kannst, um zu sehen, was es ist inds. Setzen Sie Ihren Breakpoint in und gehen Sie den Code, ist die Assembly == null? Wenn nicht, ist resourceStream null?

+0

Aus irgendeinem Grund erstickt es an diesem Ereignis, das ich nie genannt habe: ~/Plugin/PluginView1.dll/_ViewStart.cshtml – TruMan1

+0

Das ist, weil das Standardverhalten von Razor ist, den ViewStart zu laden, um die Standardeinstellungen zu laden (Layoutdatei, etc) –