0

我有以下一组用于在视图中动态加载的类。下面的代码在使用 .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%>从文件系统或自定义提供程序返回相同的值。

4

2 回答 2

1

尝试添加

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

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

编辑:

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

于 2009-10-29T16:37:37.443 回答
0

你的模型类是什么样子的?它是否包含在某个命名空间中?VPP 是非常了不起的东西,可以做很多魔法,只要确保当你通过虚拟 asp.net 'page' 内容传递'string' 时,你提供了你的类的完整路径,这样更安全。或者,另一种选择,使用您的 web.config 链接您的命名空间,因此应用程序将找到您的类。

于 2009-10-29T07:16:49.053 回答