Asp.net mvc ASP.NET MVC从数据库加载Razor视图

Asp.net mvc ASP.NET MVC从数据库加载Razor视图,asp.net-mvc,razor,Asp.net Mvc,Razor,ScottGu提到我们应该能够(查看评论部分),那么有没有人有这样做的例子 谢谢。您可能需要查看或 从我之前的问题中提取代码 在另一个页面上的FileExists()方法中,用一些db代码替换我在那里的测试代码,这些db代码实际检查virtualPath在数据库中是否有条目。您的数据库看起来像: Views --tablename Path --view's virtual path SomeOtherValue …然后你的电话会是这样的 public class DbPath

ScottGu提到我们应该能够(查看评论部分),那么有没有人有这样做的例子

谢谢。

您可能需要查看或

从我之前的问题中提取代码

在另一个页面上的
FileExists()
方法中,用一些db代码替换我在那里的测试代码,这些db代码实际检查virtualPath在数据库中是否有条目。您的数据库看起来像:

Views --tablename
    Path --view's virtual path
    SomeOtherValue
…然后你的电话会是这样的

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);
    }
}
现在我们修改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));
    }
}
如果您不想让virtualPath与真实的文件系统相对应,它就不必与之相对应。您可以通过实现这两个类来覆盖该功能

然后,您可以像这样在global.asax中注册新的VirtualPathProvider

HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider());

我希望这能更好地回答您的问题。

也许我遗漏了什么,但在本教程中,解决方案指出()条件是在磁盘上有一个实际的文件(/View/Pages/Test.aspx),只需提供“填充”我正在寻找一种解决方案,允许我指定整个页面。更新的问题基于对虚拟路径的混淆我正在处理一个不使用数据库的示例。在FileExists中检查“/View/Home/Test.cshtml”(我的虚拟文件),在Open方法中返回新的MemoryStream(Encoding.ASCII.GetBytes(“Hi”);当我这样做时,我得到“目录”[..]\View\Home”不存在。无法开始监视文件更改。有什么想法吗?谢谢你的帮助!您可以在问题中发布您的代码吗?最简单的测试方法是在
FileExists
方法中强制返回true。您也注册了VirtualPathProvider吗?@pbz在您的vpp中覆盖GetCacheDependency,在视图来自数据库的地方返回null