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

时间:2010-11-18 18:57:10

标签: asp.net-mvc razor

ScottGu提到我们应该能够load a Razor view from a database(查看评论部分),那么有没有人有关于如何做到这一点的例子?

感谢。

1 个答案:

答案 0 :(得分:30)

您可能需要查看Pulling a View from a database rather than a fileUsing VirtualPathProvider to load ASP.NET MVC views from DLLs

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

在另一页的FileExists()方法中,用一些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));
    }
}

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

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

HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider());

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