2010-11-18 11 views

Respuesta

30

Es posible que desee comprobar Pulling a View from a database rather than a file o Using VirtualPathProvider to load ASP.NET MVC views from DLLs

Tomando el código de mi pregunta anterior sobre el tema.

En su método FileExists() en la otra página reemplaza el código de prueba que tengo allí con algún código de base de datos que realmente verifique si virtualPath tiene una entrada en su base de datos. Su base de datos sería algo como:

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

... y su llamada sería entonces algo así como

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

Y ahora modificar el 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)); 
    } 
} 

El virtualPath no lo hace tiene que corresponderse con un sistema de archivos real si no lo desea. Puede anular la funcionalidad implementando estas dos clases.

entonces se puede inscribir su nuevo VirtualPathProvider en el Global.asax al igual que

HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider()); 

espero que este mejor responda a su pregunta.

+0

Tal vez me falta algo, pero en el tutorial que la solución apunta a (http://www.umbraworks.net/bl0g/rebuildall/2009/11/17/ASP_NET_MVC_and_virtual_views) la condición es tener un archivo real en disk (/View/Pages/Test.aspx) y solo proporciona el "llenado". Estoy buscando una solución que me permita especificar toda la página. – pbz

+0

pregunta actualizada en base a confusión en cuanto a los caminos virtuales – Buildstarted

+0

que estoy trabajando con un ejemplo en este momento que no utiliza una base de datos. En FileExists compruebo "/View/Home/Test.cshtml" (mi archivo virtual) y en el método Open devuelvo el nuevo MemoryStream (Encoding.ASCII.GetBytes ("

Hi

")); Cuando hago esto, aparece "Directory '[..] \ View \ Home' no existe. No se pudo iniciar la monitorización de los cambios de archivos". ¿Alguna idea? ¡Gracias por tu ayuda! – pbz

Cuestiones relacionadas