Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
304 views
in Technique[技术] by (71.8m points)

c# - Pulling a View from a database rather than a file

Is it possible to load a view from a database rather than from a file on disk? It doesn't necessarily have to be a database, could be any string really.

I think I asked this question too soon...I still look forward to any answers but I will definitely do some more research first.

Edit

So I wrote a quick sample that does what I want - to a point. I'll post updates as I get everything working properly.

public class DbPathProvider : VirtualPathProvider {
    public DbPathProvider() : base() {

    }

    public override bool FileExists(string virtualPath) {
        if (virtualPath.StartsWith("/test") || virtualPath.StartsWith("~/test"))
            return true;

        return base.FileExists(virtualPath);
        //deal with this later
    }

    public override VirtualFile GetFile(string virtualPath) {
        if (virtualPath.StartsWith("/test") || virtualPath.StartsWith("~/test"))
            return new DbVirtualFile(virtualPath);

        return base.GetFile(virtualPath);
        //deal with this later
    }

    public class DbVirtualFile : System.Web.Hosting.VirtualFile {

        public DbVirtualFile(string path) : base (path) {
            //deal with this later
        }

        public override System.IO.Stream Open() {
            return new System.IO.MemoryStream(System.Text.ASCIIEncoding.ASCII.GetBytes("this is a test"));
        }
    }
}

Update

After playing around with it I found something interesting. If I remove the return base... from the FileExists() and GetFile() methods and only return true & my DbVirtualFile the returned file is parsed and output is as expected. (Such as if I put <%:DateTime.Now.ToString()%>) - however it doesn't when I add the tests and the base returns it just outputs a literal string of whatever is in my DbVirtualFile (god I hope this makes sense) - any thoughts out there?

Final

It works. I just didn't add the inherits to the page I was testing. In this case: @inherits System.Web.Mvc.WebViewPage<dynamic>

Hope this helps someone else out there trying to do the same thing.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Yes, you'll have to create some new providers though. Here is a question that does basically the same thing, except from embedded files. This is an example that does exactly what you're looking for.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...