ビューに動的にロードするために使用した次のクラスのセットがあります。以下のコードは、.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()%>
と、「型または名前空間名 'Model' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)」というエラーが表示されます。ただし、同じコードを .ascx ファイルに配置するだけで機能します。
<%=AppDomain.CurrentDomain.ApplicationIdentity%>
ファイル システムまたはカスタム プロバイダーのいずれかから同じ値を返すため、ストリームがファイル システムまたはカスタム VirtualPathProvider から来ているように見えます。