gpt4 book ai didi

asp.net-mvc-3 - 使用自定义VirtualPathProvider加载嵌入资源部分 View

转载 作者:行者123 更新时间:2023-12-02 00:48:01 25 4
gpt4 key购买 nike

我编写了自定义 VirtualFile 和 VirtualPathProvider 实现,它们成功获取了部分 View 的嵌入式资源。

但是,当我尝试渲染它们时,它会产生以下错误:

The view at '~/Succeed.Web/Succeed.Web.Controls.SImporter._SImporter.cshtml' must derive from WebViewPage, or WebViewPage<TModel>.

在常规 View 内部渲染部分 View 时,它看起来如下所示:

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

是什么让它相信这不是片面的观点?

编辑:我发布了虚拟文件和虚拟文件提供程序实现的代码,供任何偶然发现此问题并寻找使该组件正常工作的解决方案的人使用。这个问题也适合那些基于问题标题的人。

这里是 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;
}
}

虚拟路径提供程序:

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

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

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

最佳答案

因为现在您是从某个未知位置提供您的观点,所以不再有 ~/Views/web.config文件,它适用并指示您的 razor View 的基类 ( <pages pageBaseType="System.Web.Mvc.WebViewPage"> )。因此,您可以在每个嵌入 View 的顶部添加 @inherits 指令来指示基类。

@inherits System.Web.Mvc.WebViewPage
@model ...

关于asp.net-mvc-3 - 使用自定义VirtualPathProvider加载嵌入资源部分 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7746253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com