2009-10-29 14 views
0

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é.

Répondre

1

Essayez d'ajouter

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

à votre chaîne de contrôle utilisateur dynamique.

EDIT:

Bien sûr, vous pouvez également utiliser le nom complet pour le type, le changement Model.Category() à MyApp.Model.Category(). La plupart du temps, j'importe l'espace de noms. Juste une préférence de style.

0

A quoi ressemble votre classe Model? Est-il enveloppé dans un espace de noms? VPP est une chose assez incroyable et peut faire beaucoup de magie, assurez-vous juste que lorsque vous passez 'string' avec votre contenu de page virtuelle asp.net vous fournissez le chemin complet vers vos classes, c'est plus sûr de cette façon. ou, une autre option, utilisez votre web.config pour lier vos espaces de noms, donc l'application trouvera vos classes.

+0

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. –

+0

Je ne suis pas sûr de ce que vous voulez dire par le chemin complet de mes cours. –