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

pbz*_*pbz 20 asp.net-mvc razor

ScottGu提到我们应该能够从数据库加载一个Razor视图(查看评论部分),那么有没有人有一个如何做到这一点的例子?

谢谢.

Bui*_*ted 30

您可能想要检查从数据库而不是文件中拉取视图使用VirtualPathProvider从DLL加载ASP.NET MVC视图

从我之前关于这个主题的问题中获取代码.

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

Views --tablename
    Path --view's virtual path
    SomeOtherValue
Run Code Online (Sandbox Code Playgroud)

...然后你的电话就像是

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我们修改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));
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您不想要虚拟路径,则虚拟路径不必与真实文件系统对应.您可以通过实现这两个类来覆盖功能.

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

HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider());
Run Code Online (Sandbox Code Playgroud)

我希望这能更好地回答你的问题.

  • @pbz覆盖vpp中的GetCacheDependency,返回null,其中视图来自db (7认同)