Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用VirtualPathProvider动态加载视图时的引用问题_Asp.net Mvc_Virtualpathprovider - Fatal编程技术网

Asp.net mvc 使用VirtualPathProvider动态加载视图时的引用问题

Asp.net mvc 使用VirtualPathProvider动态加载视图时的引用问题,asp.net-mvc,virtualpathprovider,Asp.net Mvc,Virtualpathprovider,我有以下一组用于在视图中动态加载的类。下面的代码在使用.RenderPartial调用时运行良好 public class VirtFile:VirtualFile { public VirtFile(string virtualPath) : base(virtualPath) { } public override Stream Open() { string path = this.VirtualPath; Str

我有以下一组用于在视图中动态加载的类。下面的代码在使用.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");
    }
公共类虚拟文件:虚拟文件
{
公共虚拟文件(字符串virtualPath):基本(virtualPath)
{
}
公共覆盖流打开()
{
字符串路径=this.VirtualPath;
Stream str=新内存流();
StreamWriter writer=新的StreamWriter(str);
writer.Write(@)
");
writer.Flush();
str.Position=0;
返回str;
}
}
公共类提供程序:VirtualPathProvider
{
public override System.Web.Caching.CacheDependency GetCacheDependency(字符串virtualPath、System.Collections.IEnumerable virtualPath Dependencies、DateTime utcStart)
{
返回null;
var dependency=new System.Web.Caching.CacheDependency(virtualPath);
返回依赖项;//base.GetCacheDependency(virtualPath、virtualPath依赖项、utcStart);
}
公共覆盖布尔目录存在(字符串virtualDir)
{
if(IsVirtual(virtualDir))
{
返回true;
}
返回base.DirectoryExists(virtualDir);
}
公共覆盖布尔文件存在(字符串virtualPath)
{
if(IsVirtual(virtualPath))
{
返回true;
}
返回base.FileExists(virtualPath);
}
公共重写VirtualFile GetFile(字符串virtualPath)
{
if(IsVirtual(virtualPath))
{
返回新的VirtFile(virtualPath);
}
返回base.GetFile(virtualPath);
}
私有bool是虚拟的(字符串虚拟路径)
{
返回virtualPath.Contains(“数据库”);
}
但是,如果我尝试将创建类型化视图的
更改为
,我会收到一个错误,指出“找不到类型或命名空间名称'Model'(是否缺少using指令或程序集引用?)。但是,如果只是将相同的代码放在.ascx文件中,则该代码也可以工作


我是否遗漏了什么,似乎流是来自文件系统还是来自自定义VirtualPathProvider它应该具有相同的加载程序集,因为
从文件系统或自定义提供程序返回相同的值。

您的模型类是什么样子的?它是否包装在某个命名空间中?VPP非常令人惊讶这是一件非常有趣的事情,可以发挥很多神奇的作用,只要确保当您通过虚拟asp.net“页面”内容传递“字符串”时,您提供了类的完整路径,这样更安全。或者,另一个选项是,使用您的web.config链接您的名称空间,这样应用程序就会找到您的类。

尝试添加

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

添加到动态用户控件字符串

编辑:


当然,您也可以为类型使用完全限定名,将
Model.Category()
更改为
MyApp.Model.Category()
。大多数时候,我导入名称空间。只是一个样式首选项。

我的模型基本上是公共类Category{public int Id{get;set;}公共字符串Title{get;set;}公共字符串描述{get;set;}public Category Parent{get;set;}}我已将Model.Category命名空间添加到web应用程序web.config中。我不确定您所说的类的完整路径是什么意思。