我有以下一组用于在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%>
从文件系统或自定义提供程序返回相同的值
答案 0 :(得分:1)
尝试添加
<%@ Import Namespace="MyApp.Model" %>
到您的动态用户控制字符串。
修改强>
当然,您也可以使用该类型的完全限定名称,将Model.Category()
更改为MyApp.Model.Category()
。大多数时候,我导入命名空间。只是一种风格偏好。
答案 1 :(得分:0)
您的Model类如何?它是否包含在某个命名空间中? VPP是非常了不起的东西,并且可以做很多魔术,只要确保当你用你的虚拟asp.net'page'内容传递'string'时,你就可以为你的课提供完整的路径,这样就更安全了。或者,另一个选项,使用您的web.config链接您的命名空间,以便应用程序找到您的类。