ScottGu提到我们应该能够load a Razor view from a database(查看评论部分),那么有没有人有关于如何做到这一点的例子?
感谢。
答案 0 :(得分:30)
您可能需要查看Pulling a View from a database rather than a file或Using 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());
我希望这能更好地回答你的问题。