Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pulling a View from a database rather than a file

Tags:

c#

asp.net-mvc

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.

like image 1000
Buildstarted Avatar asked Jul 29 '10 21:07

Buildstarted


1 Answers

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.

like image 83
Yuriy Faktorovich Avatar answered Oct 02 '22 14:10

Yuriy Faktorovich