加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 使用自定义VirtualPathProvider加载嵌入式资源

发布时间:2020-12-15 21:08:32 所属栏目:asp.Net 来源:网络整理
导读:我写了自定义VirtualFile和VirtualPathProvider实现,它们成功获取了部分视图的嵌入式资源。 但是,当我试图渲染它们会产生这个错误: 在“?/ Succeed.Web / Succeed.Web.Controls.SImporter._SImporter.cshtml”的视图必须从WebViewPage或WebViewPage TMode
我写了自定义VirtualFile和VirtualPathProvider实现,它们成功获取了部分视图的嵌入式资源。

但是,当我试图渲染它们会产生这个错误:

在“?/ Succeed.Web / Succeed.Web.Controls.SImporter._SImporter.cshtml”的视图必须从WebViewPage或WebViewPage< TModel>派生。

在渲染部分视图时,在常规视图内部,它如下所示:

Html.RenderPartial("~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml");

是什么原因导致它认为这不是局部视图?

编辑:我发布我的代码为虚拟文件&虚拟文件提供程序实现为任何人绊倒寻找解决方案获得该组件工作。这个问题也将适用于那些基于问题标题。

ere是VirtualFile实现的参考:

public class SVirtualFile : VirtualFile
{
    private string m_path;

    public SVirtualFile(string virtualPath)
        : base(virtualPath)
    {
        m_path = VirtualPathUtility.ToAppRelative(virtualPath);
    }

    public override System.IO.Stream Open()
    {
        var parts = m_path.Split('/');
        var assemblyName = parts[1];
        var resourceName = parts[2];

        assemblyName = Path.Combine(HttpRuntime.BinDirectory,assemblyName);
        var assembly = System.Reflection.Assembly.LoadFile(assemblyName + ".dll");

        if (assembly != null)
        {
            return assembly.GetManifestResourceStream(resourceName);
        }
        return null;
    }
}

VirtualPathProvider:

public class SVirtualPathProvider : VirtualPathProvider
{
    public SVirtualPathProvider() 
    { 

    }

    private bool IsEmbeddedResourcePath(string virtualPath)
    {
        var checkPath = VirtualPathUtility.ToAppRelative(virtualPath);
        return checkPath.StartsWith("~/Succeed.Web/",StringComparison.InvariantCultureIgnoreCase);
    }

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

    public override VirtualFile GetFile(string virtualPath)
    {
        if (IsEmbeddedResourcePath(virtualPath))
        {
            return new SVirtualFile(virtualPath);
        }
        else
        {
            return base.GetFile(virtualPath);
        }
    }

    public override CacheDependency GetCacheDependency( string virtualPath,IEnumerable virtualPathDependencies,DateTime utcStart)
    {
        if (IsEmbeddedResourcePath(virtualPath))
        {
            return null;
        }
        else
        {
            return base.GetCacheDependency(virtualPath,virtualPathDependencies,utcStart);
        }
    }
}

当然,不要忘记在Application_Start()事件中的项目的Global.asax文件中注册这个新的提供者

System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new SVirtualPathProvider());

解决方法

因为现在你正在从一些未知的位置提供你的视图,不再有?/ Views / web.config文件,它适用于并指示你的剃刀视图的基类(< pages pageBaseType =“System.Web.Mvc.WebViewPage” )。因此,您可以在每个嵌入视图的顶部添加一个@inherits指令,以指示基类。
@inherits System.Web.Mvc.WebViewPage
@model ...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读