ASP.NET MVC carico Rasoio vista dal database

ScottGu detto che ci dovrebbe essere in grado di carico di un Rasoio vista da un database (consultate la sezione commenti), quindi qualcuno ha un esempio su come fare?

Grazie.

InformationsquelleAutor pbz | 2010-11-18

 

One Reply
  1. 30

    Si potrebbe desiderare di controllare Tirando una Vista da un database piuttosto che un file o Utilizzando VirtualPathProvider a carico ASP.NET MVC vista da Dll

    Prendere il codice da mia precedente domanda sul tema.

    Nel FileExists() metodo d’altra pagina è possibile sostituire il codice di test ho lì con qualche db codice che effettivamente i controlli per vedere se il virtualPath ha una voce nel database. Il database potrebbe essere qualcosa del genere:

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

    …e la vostra chiamata, quindi, sarebbe qualcosa di simile a

    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);
        }
    }

    E ora andiamo a 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 deve corrispondere ad un vero e proprio filesystem se non si desidera. È possibile ignorare la funzionalità mediante l’attuazione di queste due classi.

    È possibile registrare il nuovo VirtualPathProvider nel mondiale.asax come

    HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider());

    Spero che questo meglio risponde alla tua domanda.

    • Forse mi manca qualcosa, ma nel tutorial la soluzione per i punti a (umbraworks.net/bl0g/rebuildall/2009/11/17/…) la condizione è di avere una vera e propria su disco del file (/Vista/Pagine/Test.aspx) e solo la fornitura di “riempire.” Sto cercando una soluzione che mi permette di specificare l’intera pagina.
    • Aggiornato domanda in base alla confusione percorsi virtuali
    • Sto lavorando con un esempio che non fa uso di un database. In FileExists verificare “/Vista/Home/Prova.cshtml” (il mio file virtuale) e nel metodo Open ritorno con la nuova MemoryStream(Codifica.ASCII.GetBytes(“<h1>Ciao</h1>”)); Quando faccio questo ho “Directory” [..] \Vista\Home’ non esiste. Impossibile avviare il monitoraggio delle modifiche di file.” Ogni pensiero? Grazie per il vostro aiuto!
    • Potresti postare il codice in questione – il modo più semplice per verificare è quello di forzare restituire true nel FileExists metodo – ha fatto anche registrare il tuo VirtualPathProvider?
    • Se il file non esiste su disco, è necessario implementare i componenti della directory di VirtualPathProvider – quando ho impostato qualcosa di simile ho trovato che il sistema è stato effettivamente lavorare da una lista di tutte le viste disponibili caricata la prima richiesta, piuttosto che solo chiamando FileExists a ogni richiesta.
    • ignorare GetCacheDependency nel vpp restituire null, dove la vista è dal tuo db

Lascia un commento