ASP.NET MVC загрузить Razor представление из базы данных - PullRequest
20 голосов
/ 18 ноября 2010

ScottGu упомянул, что мы должны быть в состоянии загрузить представление Razor из базы данных (см. Раздел комментариев), поэтому у кого-нибудь есть пример, как это сделать?

Спасибо.

1 Ответ

30 голосов
/ 18 ноября 2010

Возможно, вы захотите проверить Получение представления из базы данных, а не из файла или Использование VirtualPathProvider для загрузки представлений ASP.NET MVC из DLL

Получениекод из моего предыдущего вопроса на эту тему.

В своем методе FileExists() на другой странице вы заменяете тестовый код, который у меня есть, на некоторый код БД, который фактически проверяет, есть ли в 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));
    }
}

VirtualPath не должен соответствовать реальной файловой системе, если вы этого не хотите.Вы можете переопределить эту функциональность, реализовав эти два класса.

Затем вы можете зарегистрировать свой новый VirtualPathProvider в global.asax следующим образом:

HostingEnvironment.RegisterVirtualPathProvider(new DbPathProvider());

Надеюсь, это лучше ответит на ваш вопрос.

...