Вытащить представление из базы данных, а не из файла - PullRequest
12 голосов
/ 30 июля 2010

Можно ли загрузить представление из базы данных, а не из файла на диске? Это не обязательно должна быть база данных, на самом деле это может быть любая строка.

Думаю, я задал этот вопрос слишком рано ... Я все еще жду ответов, но сначала обязательно проведу еще несколько исследований.

Редактировать

Итак, я написал быстрый пример, который делает то, что я хочу - в точку. Я буду публиковать обновления, когда у меня все работает нормально.

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"));
        }
    }
}

Обновление

После игры с ним я нашел что-то интересное. Если я удаляю return base... из методов FileExists() и GetFile() и возвращаю только true, а my DbVirtualFile, возвращаемый файл анализируется и выводится, как и ожидалось. (Например, если я поставлю <%:DateTime.Now.ToString()%>) - однако это не так, когда я добавляю тесты, а база возвращает, он просто выводит буквальную строку того, что находится в моем DbVirtualFile (бог, я надеюсь, что это имеет смысл) - любые мысли там

Final

Работает. Я просто не добавил наследство на страницу, которую я тестировал. В этом случае: @inherits System.Web.Mvc.WebViewPage<dynamic>

Надеюсь, это поможет кому-то еще, пытающемуся сделать то же самое.

1 Ответ

4 голосов
/ 30 июля 2010

Да, вам придется создать несколько новых провайдеров. Здесь - вопрос, который делает в основном то же самое, за исключением встроенных файлов. Это пример, который делает именно то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...