Использование настраиваемый VirtualPathProvider для загрузки частичных представлений встроенных ресурсов

Я написал собственные реализации 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());
36
задан Feisty Mango 12 October 2011 в 21:57
поделиться