ASP.NET MVC3 Razor - создать вид из строки? - PullRequest
2 голосов
/ 03 февраля 2011

Есть ли удобный способ вернуть представление из строки вместо того, чтобы приходить из файла на диске?

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

Обновление 2-15-2011

Я наткнулся на очень хороший открытый исходный кодкомпонент , который упрощает процесс компиляции представлений Razor в коде. Я заменил большую часть кода поставщика виртуальных путей этим компонентом, и он работает невероятно хорошо.Я рекомендую его всем, кто пытается скомпилировать представления из базы данных или где-либо еще, кому не нужны дополнительные возможности поставщика виртуальных путей.Этот компонент позволяет вам скомпилировать представление непосредственно внутри вашего контроллера / приложения / чего угодно (веб-контекст и контекст контроллера не требуются) без необходимости переходить через циклы VPP.

1 Ответ

1 голос
/ 03 февраля 2011

Вы можете запустить представление самостоятельно, создав RazorTemplateEngine, который читает ваш источник и компилирует в WebViewPage.

Затем вы можете запустить WebViewPage, написав

webViewPage.OverridenLayoutPath = LayoutPath;
webViewPage.VirtualPath = ViewPath;
webViewPage.ViewContext = viewContext;
webViewPage.ViewData = viewContext.ViewData;

webViewPage.InitHelpers();
WebPageRenderingBase startPage = null;
if (RunViewStartPages) {
    startPage = StartPageLookup(webViewPage, RazorViewEngine.ViewStartFileName, ViewStartFileExtensions);
}
webViewPage.ExecutePageHierarchy(new WebPageContext(context: viewContext.HttpContext, page: null, model: null), writer, startPage);

Для поддержки нового ключевого слова @model вам необходимо переопределить методы в вашем RazorEngineHost для использования пользовательских генераторов MVC:

public override RazorCodeGenerator DecorateCodeGenerator(RazorCodeGenerator incomingCodeGenerator) {
    if (incomingCodeGenerator is CSharpRazorCodeGenerator) {
        return new MvcCSharpRazorCodeGenerator(incomingCodeGenerator.ClassName,
                                               incomingCodeGenerator.RootNamespaceName,
                                               incomingCodeGenerator.SourceFileName,
                                               incomingCodeGenerator.Host);
    }
    else if (incomingCodeGenerator is VBRazorCodeGenerator) {
        return new MvcVBRazorCodeGenerator(incomingCodeGenerator.ClassName,
                                           incomingCodeGenerator.RootNamespaceName,
                                           incomingCodeGenerator.SourceFileName,
                                           incomingCodeGenerator.Host);
    }
    return base.DecorateCodeGenerator(incomingCodeGenerator);
}

public override ParserBase DecorateCodeParser(ParserBase incomingCodeParser) {
    if (incomingCodeParser is CSharpCodeParser) {
        return new MvcCSharpRazorCodeParser();
    }
    else if (incomingCodeParser is VBCodeParser) {
        return new MvcVBRazorCodeParser();
    }
    else {
        return base.DecorateCodeParser(incomingCodeParser);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...