J'ai l'ensemble de classes suivant que j'ai utilisé pour charger dynamiquement une vue. Le code ci-dessous fonctionne bien lorsqu'il est appelé avec .RenderPartial.Problèmes de référence lors de l'utilisation de VirtualPathProvider pour charger dynamiquement une vue
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");
}
Mais si j'essaie de changer le <%="Test"%>
-<%=new Model.Category()%>
, de créer une vue tapée je reçois une erreur indiquant que « le type ou le nom namespace « modèle » n'a pas pu être trouvée (vous manque une directive à l'aide ou une référence d'assemblage?) ". Cependant, le même code fonctionne s'il est simplement placé dans un fichier .ascx. Ai-je manqué quelque chose, il semble que le flux provient du système de fichiers ou un VirtualPathProvider personnalisé, il devrait avoir les mêmes assemblys chargés, puisque <%=AppDomain.CurrentDomain.ApplicationIdentity%>
renvoie la même valeur à partir du système de fichiers ou le fournisseur personnalisé.
Mon modèle est essentiellement public class Catégorie { public int Id {get; ensemble;} public string Titre {get; set;} public string Description {get; set;} publique Catégorie parente {get; ensemble; } } J'ai ajouté l'espace de noms Model.Category aux applications Web web.config. –
Je ne suis pas sûr de ce que vous voulez dire par le chemin complet de mes cours. –