2011-03-01 41 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