使用VirtualPathProvider动态加载视图时的参考问题

时间:2009-10-29 03:58:07

标签: asp.net-mvc virtualpathprovider

我有以下一组用于在View中动态加载的类。使用.RenderPartial调用时,下面的代码运行良好。

public class VirtFile:VirtualFile
{
    public VirtFile(string virtualPath) : base(virtualPath)
    {
    }

    public override Stream Open()
    {

        string path = this.VirtualPath;
        Stream str = new MemoryStream();
        StreamWriter writer = new StreamWriter(str);
        writer.Write(@"<%@ Control Language=""C#"" Inherits=""System.Web.Mvc.ViewUserControl"" %>
            <%="Test"%> 

            ");
        writer.Flush();
        str.Position = 0;
        return str;
    }
}
public class Provider:VirtualPathProvider
{
    public override System.Web.Caching.CacheDependency GetCacheDependency(string virtualPath, System.Collections.IEnumerable virtualPathDependencies, DateTime utcStart)
    {
        return null;
        var dependency = new System.Web.Caching.CacheDependency(virtualPath);
        return dependency;// base.GetCacheDependency(virtualPath, virtualPathDependencies, utcStart);
    }
    public override bool DirectoryExists(string virtualDir)
    {
        if (IsVirtual(virtualDir))
        {
            return true;
        }
        return base.DirectoryExists(virtualDir);
    }
    public override bool FileExists(string virtualPath)
    {
        if (IsVirtual(virtualPath))
        {
            return true;
        }
        return base.FileExists(virtualPath);
    }
    public override VirtualFile GetFile(string virtualPath)
    {

        if(IsVirtual(virtualPath))
        {
            return new VirtFile(virtualPath);                
        }

        return base.GetFile(virtualPath);
    }

    private bool IsVirtual(string virtualPath)
    {
        return virtualPath.Contains("Database");
    }

但是如果我尝试将<%="Test"%>更改为<%=new Model.Category()%>,则创建一个类型化的视图我会收到一条错误,指出“找不到类型或命名空间名称'模型'(你是否遗漏了) using指令或汇编引用?)“。但是,如果将它放在.ascx文件中,则相同的代码可以正常工作。

我错过了什么,看起来流来自文件系统或自定义VirtualPathProvider它应该具有相同的已加载程序集,因为<%=AppDomain.CurrentDomain.ApplicationIdentity%>从文件系统或自定义提供程序返回相同的值

2 个答案:

答案 0 :(得分:1)

尝试添加

<%@ Import Namespace="MyApp.Model" %>

到您的动态用户控制字符串。

修改

当然,您也可以使用该类型的完全限定名称,将Model.Category()更改为MyApp.Model.Category()。大多数时候,我导入命名空间。只是一种风格偏好。

答案 1 :(得分:0)

您的Model类如何?它是否包含在某个命名空间中? VPP是非常了不起的东西,并且可以做很多魔术,只要确保当你用你的虚拟asp.net'page'内容传递'string'时,你就可以为你的课提供完整的路径,这样就更安全了。或者,另一个选项,使用您的web.config链接您的命名空间,以便应用程序找到您的类。