从一个文件生成Razor和Webforms标记

时间:2011-10-09 19:48:28

标签: asp.net webforms razor t4

在我们的项目中,我们偶然发现了以下问题:我们需要为开发人员提供两种母版页(基于Razor和基于Webforms),每种母版页都会生成完全相同的HTML输出

我们最初的想法是使用T4模板引擎并且只有一个模板可以生成2个文件:*.master*.cshtml其中,例如@using Razor指令将对应于<%@ Import ... webforms声明。

关键的想法是HTML部分不应该重复,所以显然我们无法使用Generating more than one output file from a templateHow to use T4 to generate two files at the same time from one template?中建议的方法,因为所有的静态内容(纯HTML) )在这种情况下将被复制。

显然我可以编写我的自定义T4生成器,但它会很复杂,因为页面上有太多的指令(​​如"<%="对应于Razor中的"@")。

关于如何使用任何可用的模板引擎实现此目的的任何其他想法?

1 个答案:

答案 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参数的值并适当地呈现必要的指令。