2012-04-05 101 views
0

我尝试了一些herehere的代码,但在尝试引用位​​于单独项目中的远程视图时,页面上出现错误:“值不能为空。 :流“可插入的MVC视图返回null

以下是我的主MVC 4项目中的AssemblyResourceProvider和控制器。我也附上了整个解决方案本身here。任何人都可以帮忙看看发生了什么问题吗?感谢您的任何帮助或建议。

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; 
     } 
    } 

而且我家的控制器:

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

enter image description here

+0

是的,公共覆盖Stream Open()无法找到程序集并返回null流,或者GetManifestResourceStream找不到具有该名称的资源。如果cshtml文件未设置为嵌入式资源或者您的完整名称空间错误,则可能会发生这种情况。 – 2012-04-05 16:19:34

+0

我确实记得要嵌入资源,并且我相信根据另一篇文章我的命名空间是正确的。 – TruMan1 2012-04-05 16:55:36

+0

您是否记得将DLL复制到Bin文件夹中?或者你从哪里加载你的插件? – 2012-04-05 17:14:22

回答

0

这是我AssemblyResourceVirtualFile,我在一个项目中使用之前:

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; 
    } 
} 

真的,唯一的区别就是我”已经做到了,所以你可以在那里贴上断点,然后走路看看它是什么INDS。把你的断点放在代码中,是程序集== null?如果没有,是resourceStream null?

+0

出于某种原因,它对这个事件感到窒息,我从来没有这样称呼过:〜/ Plugin/PluginView1.dll/_ViewStart.cshtml – TruMan1 2012-04-05 17:34:51

+0

那是因为Razor的默认行为是加载ViewStart来加载默认设置(布局文件,等等) – 2012-04-05 17:49:28