2010-11-18 11 views

risposta

30

si potrebbe voler controllare Pulling a View from a database rather than a file o Using VirtualPathProvider to load ASP.NET MVC views from DLLs

Prendendo il codice dalla mia precedente interrogazione sull'argomento.

Nel metodo FileExists() nell'altra pagina si sostituisce il codice di test che ho lì con un codice db che controlla effettivamente se VirtualPath ha una voce nel database. Il database sarebbe simile:

Views --tablename 
    Path --view's virtual path 
    SomeOtherValue 

... e la chiamata sarebbe allora qualcosa come

public class DbPathProvider : VirtualPathProvider { 
    public DbPathProvider() : base() { 

    } 

    public override bool FileExists(string virtualPath) { 
     Database db = new Database(); 
     return db.Views.Any(w => w.Path == virtualPath); 
    } 

    public override VirtualFile GetFile(string virtualPath) { 
     return new DbVirtualFile(virtualPath); 
    } 
} 

Ed ora modificare il DbVirtualFile

public class DbVirtualFile : System.Web.Hosting.VirtualFile { 

    public DbVirtualFile(string path) : base (path) { 

    } 

    public override System.IO.Stream Open() { 
     Database db = new Database(); 
     return new System.IO.MemoryStream(
        db.Views.Single(v => v.Path == this.VirtualPath)); 
    } 
} 

Il virtualPath non lo fa deve corrispondere ad un vero filesystem se non lo vuoi. È possibile sovrascrivere la funzionalità implementando queste due classi.

È quindi possibile registrare il nuovo VirtualPathProvider nel global.asax in questo modo

HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider()); 

Spero che questo meglio risponde alla tua domanda.

+0

Forse mi manca qualcosa, ma nel tutorial la soluzione punta a (http://www.umbraworks.net/bl0g/rebuildall/2009/11/17/ASP_NET_MVC_and_virtual_views) la condizione è di avere un file reale su disco (/View/Pages/Test.aspx) e fornire solo il "riempimento". Sto cercando una soluzione che mi permetta di specificare l'intera pagina. – pbz

+0

Domande aggiornate basate sulla confusione sui percorsi virtuali – Buildstarted

+0

Attualmente sto lavorando con un esempio che non utilizza un database. In FileExists cerco "/View/Home/Test.cshtml" (il mio file virtuale) e nel metodo Open torno a nuovo MemoryStream (Encoding.ASCII.GetBytes ("

Hi

")); Quando faccio questo ottengo "Directory" [..] \ View \ Home "non esiste. Impossibile avviare il monitoraggio delle modifiche ai file." qualche idea? Grazie per l'aiuto! – pbz

Problemi correlati