http://blogs.msdn.com/b/webdev/archive/2009/01/29/t4-templates-a-quick-start-guide-for-asp-net-mvc-developers.aspx
在中提到我們的最近部落格文章,ASP.NET MVC 發布候選版,我們的代碼產生功能 (即,添加控制器和添加視圖) 現在使用 T4 (文本模板轉換工具包) 模板化技術在幕後。因為使用者可以自訂的模板很大程度上,我們想要寫一篇博文,使每個人都加快關於 T4。
模板位置和模板重寫
添加控制器和添加視圖對話方塊執行使用在幕後的 T4 模板的代碼產生。可以修改這些模板可以自訂從這些工具產生的程式碼。您可以找到模板位於以下位置: [Visual Studio 安裝目錄] \Common7\IDE\ItemTemplates\ [CSharp |安全性] \Web\MVC\CodeTemplates\
此外可以將 'CodeTemplates' 檔案夾複製到項目的根目錄中,以便能夠重寫在上述地點模板和自訂的模板在每個項目的基礎上 (或者,只是建立一個名為 'CodeTemplates' 檔案夾和下,建立一個名為 'AddController' 或 'AddView' 檔案夾)。請注意您可以選擇重寫某些模板而不是其他是否你這麼想 — — 這些對話方塊將尊重的優先順序的什麼是您的項目中正確。此外經常留意對於添加視圖對話方塊中,您可以添加您自己的.tt 檔案要麼在全球的位置或在您的項目中,讓他們在查看內容對話方塊中的下拉自動填滿。
請注意將上述檔案夾 (真的,任何時間您將添加一個.tt 檔案) 複製到項目時,您將看到警告,如下所示:
這樣你不啟動並執行 T4 模板 (如果您要添加多個.tt 檔案像 'CodeTemplates' 檔案夾複製時,你將不得不每次打取消),撞到取消。這是因為該項目儘快看到一個.tt 檔案,該檔案是一個屬性上的檔案稱為 'customtool ' 將擷取設定為 'TextTemplatingFileGenerator' 這告訴 Visual Studio 做是若要使用預設 T4 主機執行模板並建立一個新檔案 (嵌套模板下方) 基於什麼是在模板中。
產生器可以有一次性檔案產生基於模板,或只是玩弄 T4 — — 然而,因為的好方法添加視圖和添加控制器模板具有代碼在他們的依賴於自訂模板的主機 (如您稍後將看到),使用的預設產生器執行這些模板只需將建置錯誤。去吧,要將模板複製到您的項目後只是空的自訂工具屬性清除。
注意: 如果你想要擺脫的映射的自動.tt 檔案上設定自訂工具,你可以做通過註冊表 — — 請注意如果您想要將這些登錄機碼還原到它們的預設值,您可以從 Visual Studio 安裝程式,在執行修複或條目重新手動添加。啟動登錄編輯程式 (開始 → 運行 → regedit) 和定位到具體取決於您是否使用 Windows 32 位或 64 位元安裝在以下位置之一:
32 位: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\Generators
64 位元: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\Generators
展開每個直接下發電機的節點,尋找名為 '.tt' 任何條目。設定註冊表值命名 (預設) 為空白。就這麼簡單 !
如果您想要重寫的通用範本,但不想將一個名為 'CodeTemplates' 的檔案夾複製到您的項目 (因為你已經有一個檔案夾命名,大概是),你可以通過登錄機碼更改的檔案夾添加控制器和添加視圖看看的名稱。啟動登錄編輯程式 (開始 → 運行 → regedit) 和定位到具體取決於您是否使用 Windows 32 位或 64 位元安裝在以下位置之一:
32 位: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\MVC\CodeTemplates
64 位元: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\VisualStudio\9.0\MVC\CodeTemplates
更改為 'OverrideDir' 到你想要的工具在您的項目中尋找的值。請注意在此檔案夾下將仍然要保持同一階層之前,與一個名為 'AddController' 檔案夾和/或一個名為 AddView 檔案夾。
編輯 T4 模板
如果您開啟 Visual Studio 裡面一個.tt 檔案,您可能會注意到它們看起來有點平 — — 像一堵牆的黑色文本。我們高度強烈建議您下載T4 編輯器中,載入到 Visual Studio,提出Clarius 諮詢,為您提供文法反白和一些基本的 T4 陳述式完成的。他們有免費的版本稱為社區版,以及更強大的專業版 — — 如果你有興趣查閱功能比較。此附加元件真的使很大的不同,在模板創作,因為你可以看到下面。
T4 模板的解剖
入門模板編輯自己最簡單的方法是看看我們的預設範本是如何工作的。為此,我們會通過一些片斷的 '建立' 模板 (Create.tt) 去添加視圖。讓我們從頂部開始:
這四行是所有指令.
您可以找到更多的文檔在這裡 T4 指令: http://msdn.microsoft.com/en-us/library/bb126421.aspx
向下移動只有一點,你會注意到下面的行:
在這條線我們建立新變數命名 'mvcHost',並將其分配給一個鑄造版本的一個名為 Host 屬性。主機屬性是東西向模板自動提供因為將我們 'HostSpecific' 屬性設定為 True 在上述模板指令中。MVC 工具提供一個自訂主機,以便能夠將資訊傳遞給外部工具沒有可用的模板。若要訪問提供我們主機類上的屬性,需要將可轉換為我們主控件類型,這是 'MvcTextTemplateHost' 主機屬性。
此變數是如何使用的?這是實際上非常簡單:
第一件事要注意有代碼括內 '< #' 和' #> ' 標記。這些標記稱為語句塊和用於括起的控制碼。您的模板可能會想要有條件地輸出到輸出檔案中的某些文字區塊的和阻止其他區塊被輸出。以上,我們有if語句 (C# 編寫的因為我們的範本語言 C# 模板指令中設定),開啟大括弧。這個if語句的右大括弧顯示下面幾行線 17、 在不同的語句塊中。請注意此特定如果語句正在訪問一個叫做 'IsViewUserControl',告訴模板是否使用者選擇了和一個局部視圖一起去在主機上的屬性。
在模板中以外的文字區塊的都是實際文字區塊的輸出到最後檔案。在上面的,行 14 文本不在任何塊和因而是一部分的輸出 — — 然而,它將被放入輸出檔案只有當線 12 日if語句的計算結果為 true。
你可以瞭解更多有關 T4 語句塊在這裡: http://msdn.microsoft.com/en-us/library/bb126509.aspx
最簡單的方法讓我想起一個 T4 模板中的控制項代碼是縫在一起在你的頭在一個大的程式。我們先前在第 6 行聲明的變數可以在跟隨它 — — 的 T4 控制碼和使用這些如果其他分公司的每個有條件地向輸出檔案中添加一些文本 (顯示為灰色)。上述 if else 語句正在檢查我們模板主機到添加視圖模板所公開的一些屬性。
我們移動一點再往下,看到一個好奇的語句塊,如下所示:
我們聲明一個變數稱為類型列表的字串 < > 的屬性。如何,我們能夠在我們 T4 代碼中使用清單類型?這是模板的因為我們看到在頂部此匯入指令:
線 56 然後調用一種方法叫做 'FilterProperties' — — 但這種方法位於何處?它實際上是靠近底部的模板定義的:
如果你仔細看,與不同的語句塊,此代碼塊的開頭 ' < #+ '。這被稱為類功能塊,和他們這樣工作: T4 會把所有該類中您的模板的功能,並將它們添加到從您的模板在幕後編譯的類。這不只是限於方法,但也像屬性 (任何通常會下一類) 的事情。像常規代碼檔案中的類的成員,這些現在成為可訪問到您的模板代碼的其餘部分。
閱讀