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 文件夹。
如果您打开 Visual Studio 里面一个.tt 文件,您可能会注意到它们看起来有点平 — — 像一堵墙的黑色文本。我们高度强烈建议您下载T4 编辑器中,加载到 Visual Studio,提出Clarius 咨询,为您提供语法突出显示和一些基本的 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 会把所有该类中您的模板的功能,并将它们添加到从您的模板在幕后编译的类。这不只是限于方法,但也像属性 (任何通常会下一类) 的事情。像常规代码文件中的类的成员,这些现在成为可访问到您的模板代码的其余部分。
阅读更多关于类功能块在这里: http://msdn.microsoft.com/en-us/library/bb126541.aspx
我们的默认模板来自上面截图的 'FilterProperties' 方法由默认输出标记仅用于中的类型 — — 即那些是公共的和会还显示在设计器中的 GridView 之类的某些属性。这种逻辑是与您会从调用GridView.IsBindableType方法完全相同。
线 136 上调用的 'IsBindableType' 方法定义有点进一步下来在模板中:
如果你想要改变我们的模板筛选出哪些属性,您可以根据自己的喜好修改这些方法之一。
最后,我们看看下面的线 65:
在这里,我们有一种新的构造,始于 ' < #= '。这称为表达式块,它用于将值从 T4 代码插入到输出文本。你可以看到上面,我们有循环访问属性和定义本地变量到循环称为 '属性名称' 的 foreach 循环。因为我们想要输出的 < th > 标记,每个属性名称,所以我们使用表达式块引用该变量。
你可以找到更多关于表达式块,在这里: http://msdn.microsoft.com/en-us/library/bb126508.aspx
正如您所看到的通过它您可以有选择地输出 T4 模板中的文本的各种方法使 T4 非常强大的工具中的自定义输出灵活获取自动代码生成的生产力。
添加控制器和添加视图对话框每个公开到模板的模板的主机,通过不同的属性,如上所示我们创建模板的系统故障。这里是公开的我们模板的主机,您要使用的模板的可用属性的完整列表 (注: 这些属性的确切名称可能会更改 RC 和最终版本之间):
属性名称 |
类型 |
说明 |
项目名称 |
System.String |
控制器类,包括控制器后缀的名称 |
命名空间 |
System.String |
控制器正在生成到的命名空间 |
ExtraActionMethods |
System.Boolean |
指示用户无论选中添加控制器对话框中的选项来获得额外的操作方法 |
ControllerRootName |
System.String |
没有控制器后缀的控制器类的名称 |
属性名称 |
类型 |
说明 |
项目名称 |
System.String |
(不带扩展名),视图作为在添加视图对话框中键入的名称 |
命名空间 |
System.String |
视图的父文件夹的默认命名空间 |
IsViewUserControl |
System.Boolean |
计算结果为 true,如果用户在添加视图对话框中选择一个局部视图 |
IsViewContentPage |
System.Boolean |
计算结果为 true,如果该用户同一个母版页创建视图 |
IsViewPage |
System.Boolean |
计算结果为 true,如果该用户创建常规视图页 |
MasterPage |
System.String |
在母版页上,用户的路径选择对话框中的 (IsViewContentPage 是 true 时,才使用) |
占位符 |
System.String |
所生成的内容将放入其中的主要内容占位符的名称。这是用户键入到添加视图对话框中的内容的地方持有人 id |
里面 |
System.Collections.Generic.List < System.String > |
列表中的所有内容占位符的事件的 ID 在主页面中,如果为此视图选择一个母版页 |
LanguageExtension |
System.String |
输出文件的扩展名 (包括期间) |
ViewDataTypeGenericString |
System.String |
这是一个字符串,用来输出为视图的指令 (对于强类型视图) 中的 '继承' 属性指定泛型子句。示例:"< MyType >"或"(的 MyType)" |
ViewDataType |
System.Type |
这是一个类型对象,该对象代表一个强类型的视图所绑定到的类型。它可以用于获取有关的属性中的类型和类似的信息 |
此外,还有几个由公开的属性的默认主机属性,您可能会发现很有用,如当前正在执行的模板的路径。你可以阅读更多有关这些属性在这里:http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.texttemplating.itexttemplatingenginehost_properties.aspx