Я написал собственные реализации VirtualFile и VirtualPathProvider, которые успешно получают встроенные ресурсы, являющиеся частичными представлениями.
Однако, когда я пытаюсь отобразить их, возникает следующая ошибка:
Представление в '~ / Succeed.Web / Succeed.Web.Controls.SImporter._SImporter.cshtml' должно быть производным от WebViewPage или WebViewPage
При рендеринге частичного представления внутри обычного представления он выглядит следующим образом:
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;
}
}
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);
}
}
}
И, конечно же, не забудьте зарегистрировать этого нового провайдера в файле Global.asax вашего проекта в событии Application_Start ()
System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new SVirtualPathProvider());