【问题标题】:Pluggable MVC view return null可插入的 MVC 视图返回 null
【发布时间】:2012-04-05 16:17:16
【问题描述】:

我尝试遵循herehere 中的一些代码,但是在尝试引用位​​于单独项目中的远程视图时,页面上出现错误:“值不能为空。参数名称:流”

下面是我的主 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");
}

【问题讨论】:

  • 是的,公共覆盖 Stream Open() 无法找到程序集并返回空流或 GetManifestResourceStream 找不到具有该名称的资源。如果 cshtml 文件未设置为嵌入式资源或您的完整命名空间错误,则可能会发生这种情况。
  • 我确实记得嵌入了资源,并且根据另一篇文章,我相信我的命名空间是正确的。
  • 您是否记得将 DLL 复制到 Bin 文件夹中?或者您从哪里加载插件?
  • 是的,谢谢。我的主 MVC 应用程序正在引用该项目,并确保 DLL 实际上位于那里的 bin 文件夹中。
  • 出于某种原因,即使我从来没有这样称呼它,它也令人窒息:~/Plugin/PluginView1.dll/_ViewStart.cshtml

标签: c# asp.net .net asp.net-mvc razor


【解决方案1】:

这是我之前在项目中使用的 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;
    }
}

真正的唯一区别是我已经做到了,所以你可以在那里设置断点,然后走过去看看它会发现什么。将断点放入并遍历代码,程序集 == null 吗?如果不是,resourceStream 是否为空?

【讨论】:

  • 由于某种原因,这个事件令人窒息,但我从来没有这样称呼它:~/Plugin/PluginView1.dll/_ViewStart.cshtml
  • 那是因为 Razor 的默认行为是加载 ViewStart 以加载默认设置(布局文件等)
猜你喜欢
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多