2011-03-01 11 views
5

Estoy tirando de marcado de una vista de la maquinilla de afeitar de la base de datos, como se detalla en esta pregunta:cargar la vista de la maquinilla de afeitar de db, pero ViewBag se rompe

ASP.NET MVC load Razor view from database

que puede tirar de la vista, pero falla en ejecución porque ViewBag no se reconoce.

CS0103: El nombre 'ViewBag' no existe en el contexto actual

¿Alguna sugerencia?

Aquí está la fuente:

mundial:

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      System.Web.Hosting.HostingEnvironment.RegisterVirtualPathProvider(new BearForce.Web.Core.DbPathProvider()); 
      RegisterGlobalFilters(GlobalFilters.Filters); 
      RegisterRoutes(RouteTable.Routes); 
     } 

profesional de la ruta:

namespace BearForce.Web.Core 
{ 
    public class DbPathProvider : VirtualPathProvider 
    { 
     public DbPathProvider() 
      : base() 
     { 

     } 

     public override bool FileExists(string virtualPath) 
     { 
      var repo = new Repository(); 

      var viewPage = repo.GetView(240, virtualPath); 

      if (base.FileExists(virtualPath)) 
      { 
       return true; 
      } 

      if (viewPage != null) 
      { 
       return true; 
      } 

      return false; 

     } 

     public override VirtualFile GetFile(string virtualPath) 
     { 
      if (base.FileExists(virtualPath)) 
      { 
       return base.GetFile(virtualPath); 
      } 

      var repo = new Repository(); 
      var result = repo.GetView(240, virtualPath); 

      var vf = new DbVirtualFile(virtualPath, result.Markup); 
      return vf; 
     } 


    } 
} 

mi archivo virtual:

public class DbVirtualFile : System.Web.Hosting.VirtualFile 
    { 
     string _fileContents = string.Empty; 
     public DbVirtualFile(string path, string fileContents) 
      : base(path) 
     { 
      _fileContents = fileContents; 
     } 

     public override System.IO.Stream Open() 
     { 
      return new System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes(_fileContents)); 
     } 
    } 

Mi controlador:

public ActionResult Index() 
     { 
      ViewBag.Title = "aaah!!! Muppets!!! Help!!!!!"; 

      return View(); 
     } 

Obviamente, esto es una prueba de concepto, por lo que los nombres son todos tontos y el código descuidado como el demonio ...

Respuesta

4

Usted debe asegurarse de que la vista que están regresando corresponde a una vista de afeitar. Aquí hay un ejemplo de trabajo simplificado:

public class CustomPathProvider : VirtualPathProvider 
{ 
    private class CustomVirtualFile : VirtualFile 
    { 
     public CustomVirtualFile(string path) 
      : base(path) 
     { } 

     public override Stream Open() 
     { 
      return new MemoryStream(Encoding.UTF8.GetBytes("Hello @ViewBag.Name")); 
     } 
    } 

    public override bool FileExists(string virtualPath) 
    { 
     // This is very important: make sure that here you 
     // are returning true only for Razor view pages or 
     // you won't have ViewBag. 
     // In this oversimplified example we support 
     // the index view for the home controller 
     return virtualPath == "/Views/Home/Index.cshtml"; 
    } 

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

que se registra en Application_Start:

protected void Application_Start() 
{ 
    AreaRegistration.RegisterAllAreas(); 
    RegisterGlobalFilters(GlobalFilters.Filters); 
    RegisterRoutes(RouteTable.Routes); 
    HostingEnvironment.RegisterVirtualPathProvider(new CustomPathProvider()); 
} 

y, finalmente, un controlador de ejemplo:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Name = "John"; 
     return View(); 
    } 
} 

Y una última observación muy importante si está implementando una costumbre VirtualPathProvider:

Esto no funciona si su aplicación web está precompilada. Por lo tanto, si usa la precompilación (cosas como Publicar ... o Proyectos de implementación web), nunca se usará su proveedor de ruta de acceso virtual personalizado.

+0

Editado para incluir la fuente –

17

Para las personas futuras que obtengan este error, puede obtener este error exacto si sus archivos web.config no se encuentran en sus Vistas y en la carpeta de su proyecto raíz.

+0

+1 Me alegro de haber hecho scroll aquí. ¡Esto es exactamente lo que me estaba perdiendo! – Mrchief

+1

Probablemente es común si se usa el control de código fuente y se olvida de confirmar los archivos .config :) –

+0

¡Gracias, resolvió mi problema! Descubrí que web.config en Views se marcó como Acción de compilación: ninguna en lugar de contenido, por lo que no se publicó. Esto sucedió después de instalar MVC3 en un proyecto de Webforms. –

Cuestiones relacionadas