У меня есть следующий набор классов, которые я использовал для динамической загрузки в 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%>
возвращает то же значение из файловой системы или из пользовательского провайдера. 1009 *