2011-10-09 23 views
0

在我們的項目中,我們偶然發現了以下問題:我們需要爲我們的開發人員提供兩種母版頁(基於Razor和Webforms),每個母版頁都會生成相同的HTML輸出從一個文件生成Razor和Webforms標記

我們最初的想法是使用T4模板引擎,並只有一個模板,將產生2個文件:*.master*.cshtml地方,例如@using剃刀指令將對應<%@ Import ... web表單聲明。

的核心思想是,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中的"@")。

有關如何使用任何可用的模板引擎完成此任何其他想法?

回答

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參數的值,並適當地提供必要的指示。

+0

如果這對你有用,這聽起來對我來說很好。如果你把所有的代碼放在T4文件中的一個函數中,並且調用它兩次,但可能你會有一個TT文件,但是因爲我從來沒有將模板渲染到多個文件中,所以我不能100%確定這種方法是否有效。 – FuleSnabel

+0

感謝您的評論。我的想法是,有一個模板可以解釋不同的輸入參數,另一個模板可以設置並運行模板,這對於職責分離是一件好事。除了考慮T4內在函數之外,我認爲在技術上不可能將可重用模板與運行它的參數和代碼聯合起來。也許我在這個問題上有錯,但這是一個不同的問題。 –

+0

不知道模板的外觀細節,我不能說它是不可能或不可能,但它很好,你找到你喜歡的解決方案。 – FuleSnabel