【问题标题】:Load Razor view from db, but ViewBag is broken从 db 加载 Razor 视图,但 ViewBag 已损坏
【发布时间】:2011-07-06 18:28:29
【问题描述】:

我正在从数据库中提取 razor 视图的标记,如以下问题所述:

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

显然,这是一个概念证明,所以名字都很傻,代码也很草率......

【问题讨论】:

    标签: asp.net-mvc-3 razor


    【解决方案1】:

    对于以后遇到此错误的人,如果您的视图和根项目文件夹中缺少 web.config 文件,您可能会收到此确切错误。

    【讨论】:

    • +1 很高兴我在这里滚动。这正是我所缺少的!
    • 如果使用源代码管理并忘记提交 .config 文件可能很常见 :)
    • 谢谢,解决了我的问题!我发现 Views 中的 web.config 被标记为 Build Action: None 而不是 Content,所以它没有被发布。这发生在将 MVC3 安装到 Webforms 项目之后。
    • 但这与问题无关。
    【解决方案2】:

    您应该确保您返回的视图与剃刀视图相对应。这是一个简化的工作示例:

    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注册:

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

    最后是一个示例控制器:

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

    如果您要实现自定义VirtualPathProvider,最后还有一个非常重要的评论:

    如果您的 Web 应用程序是预编译的,这将不起作用。因此,如果您使用预编译(例如发布...或 Web 部署项目),您的自定义虚拟路径提供程序将永远不会被使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      • 2016-01-26
      • 2019-08-16
      • 2014-05-14
      • 1970-01-01
      相关资源
      最近更新 更多