在我们的项目中,我们偶然发现了以下问题:我们需要为开发人员提供两种母版页(基于Razor和基于Webforms),每种母版页都会生成完全相同的HTML输出
我们最初的想法是使用T4模板引擎并且只有一个模板可以生成2个文件:*.master
和*.cshtml
其中,例如@using
Razor指令将对应于<%@ Import ...
webforms声明。
关键的想法是HTML部分不应该重复,所以显然我们无法使用Generating more than one output file from a template或How to use T4 to generate two files at the same time from one template?中建议的方法,因为所有的静态内容(纯HTML) )在这种情况下将被复制。
显然我可以编写我的自定义T4生成器,但它会很复杂,因为页面上有太多的指令(如"<%="
对应于Razor中的"@"
)。
关于如何使用任何可用的模板引擎实现此目的的任何其他想法?
答案 0 :(得分:2)
经过一些头脑风暴自定义模板(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参数的值并适当地呈现必要的指令。