Создание разметки Razor и Webforms из одного файла - PullRequest
0 голосов
/ 09 октября 2011

В нашем проекте мы столкнулись со следующей проблемой: нам нужно предоставить нашим разработчикам два типа главных страниц (на основе Razor и на основе веб-форм), каждая из которых будет генерировать точно такой же вывод HTML .

Нашей первоначальной мыслью было использовать шаблонизатор T4 и иметь только один шаблон, который будет порождать 2 файла: *.master и *.cshtml, где, например, директива @using Razor будет соответствовать <%@ Import ... выражению webforms.

Основная идея заключается в том, что части HTML не должны дублироваться , поэтому очевидно, что мы не можем использовать подход, рекомендованный в Создание более одного выходного файла из шаблона или Как использовать T4 для генерации двух файлов одновременно из одного шаблона? , потому что весь статический контент (обычный HTML) в таком случае будет продублирован.

Очевидно, что я могу написать свой собственный генератор T4, но он будет сложным, потому что на страницах слишком много директив (например, "<%=", которые будут соответствовать "@" в Razor).

Любые другие идеи о том, как я могу сделать это, используя любой доступный движок шаблонов?

1 Ответ

2 голосов
/ 10 октября 2011

После нескольких мозговых штурмов пользовательских шаблонов (http://www.olegsych.com/2008/09/t4-tutorial-creating-reusable-code-generation-templates/) все получилось.

Идея состоит в том, чтобы два шаблона : один шаблон для хранения HTML и логики условного рендерингадругой шаблон для запуска первого два раза с другими параметрами.

Запуск шаблона может выглядеть следующим образом:

<#@ include file="GenericMasterPageTemplate.tt" #>
<#
GenericMasterPageTemplate genericMasterPageTemplate = new  GenericMasterPageTemplate();
genericMasterPageTemplate._viewEngine = "Razor";
genericMasterPageTemplate.Output.File = @"PATH_TO_OUTPUT_RAZOR_TEMPLATE";
genericMasterPageTemplate.Render();

genericMasterPageTemplate._viewEngine = "Webforms";
genericMasterPageTemplate.Output.File = @"PATH_TO_OUTPUT_WEBFORMS_TEMPLATE";
genericMasterPageTemplate.Render();
#>

Очевидно, что условная логика в первом шаблоне будет анализироватьзначение параметра _viewEngine и соответствующим образом отобразить необходимые директивы.

...