2011-03-01 42 views
5

我从数据库中提取剃刀视图的标记,因为在这个问题详述:负载Razor视图,但ViewBag被打破

ASP.NET MVC load Razor view from database

我可以拉的观点,但它不能在因为ViewBag无法识别。

CS0103: 'ViewBag' 这个名字不会在目前情况下

任何建议存在吗?

这里的源:

全球:

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

我的路径提供:

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


    } 
} 

我的虚拟文件:

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

我的控制器:

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

      return View(); 
     } 

显然,这是一个概念证明,这样的名字都是愚蠢和草率的代码是地狱......

回答

4

你应该确保该视图要返回对应于剃刀视图。下面是一个简化的工作例如:

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

这将在Application_Start注册:如果您正在实现

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

而且最后很重要的话:

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

最后一个样本控制器自定义VirtualPathProvider

This如果您的Web应用程序已预编译,则不起作用。因此,如果您正在使用预编译(例如Publish ...或Web部署项目),您的自定义虚拟路径提供程序将永远不会使用。

+0

编辑为包含来源 – 2011-03-01 19:43:45

17

对于将来出现此错误的人,如果您的视图和根项目文件夹中缺少web.config文件,则可能会得到此确切错误。

+0

+1很高兴我在这里滚动。这正是我错过的! – Mrchief 2011-05-25 15:57:18

+1

如果使用源代码管理并忘记提交.config文件,可能很常见:) – 2011-05-26 23:21:34

+0

谢谢,解决了我的问题!我发现Views中的web.config被标记为Build Action:None而不是Content,所以它没有被发布。将MVC3安装到Webforms项目后发生这种情况。 – 2011-05-31 19:37:17