在上一篇MVC开发T4代码生成之一----文本模板基础中介绍了与T4模板相关的基础知识,并对MVC内使用T4模板添加视图做了介绍。知道了T4模板的使用后自然就想着怎么对vs自带的T4模板进行扩展,添加一些我们自定义的T4模板。有两种途径可以对vs的T4模板进行扩展:
a.直接在vs模板目录内(C:Program Files (x86)Microsoft Visual Studio 14.0Common7IDEExtensionsMicrosoftWebMvcScaffoldingTemplatesMvcView)添加,这种方法添加的 模板属于IDE级,可以应用在所有项目内;b.在项目内新建“CodeTemplatesMvcView”目录,在其中添加模板,这种方法添加的模板仅应用与所在项目。下面分别对这两种方法进行介绍。
在vs模板目录内添加T4模板
这种添加很简单,只需将添加T4模板文件并按照文件命名规则命名就可以,C#的就以.cs.t4命名,vb的就以.vb.t4命名,添加完成后在vs模板内就多出了我们新添加的,例如我们在目录内新添加了一个Test.cs.t4模板,添加无需重启vs即可,并且添加的模板在所有项目内均可使用。
添加前后vs内模板变化如图所示:
在项目内新建“CodeTemplatesMvcView”目录添加模板
有时我们希望建立一个仅用于项目内使用的T4模板,例如我们认为vs自带的List模板不适于项目,于是自定义了一个新的List模板,新的List模板仅用于当前项目,如果在vs目录内添加那我们就需要在新List模板文件名称上添加必要信息与原有List模板做区分,等时间长了添加多了后在vs内新建视图时就会出现一堆List模板,然后每次添加都要进行区分,显然这样很不明智,我们也不能随意替换或删除某个List模板,因为他们可能被其他项目使用了。
建立仅用于项目内使用的T4模板步骤很简单,只需要在项目内添加“CodeTemplatesMvcView”目录结构,然后在其中添加T4模板即可,即使新添加的模板与vs目录内模板重名在使用时也会以项目内模板生成,此时也不会对vs目录内模板造成影响。需要注意的是目录结构必须与“CodeTemplatesMvcView”一致,另外如果新建T4模板需要使用vs自带的Imports和ModelMetadataFunctions模板文件时,新建T4模板相应的include指令要使用绝对目录或者把vs目录内的Imports和ModelMetadataFunctions模板文件复制到项目CodeTemplatesMvcView目录内。
例如我们使用如下TestViewModel视图模型生成分布视图,TestViewModel内容如下:
public class TestViewModel { public string Name { get; set; } public string Age { get; set; } }
首先使用vs自带的Create模板生成视图,生成视图时的对话框配置如下:
生成的视图如下:
然后我们在项目内新建“CodeTemplatesMvcView”目录结构,将vs目录内的Imports.include.t4和ModelMetadataFunctions.cs.include.t4模板文件复制到项目CodeTemplatesMvcView目录内,在项目内“CodeTemplatesMvcView”下新建文本文件并改名为Create.cs.t4,至于模板内容我们直接复制vs自带的Create.cs.t4内容将其中“<h4><#= ViewDataTypeShortName #></h4>“修改为”<h4><#= ViewDataTypeShortName #>---这是由项目内Create模板生成的视图</h4>“然后保存重新生成视图:
此时可以看到在模板选项内仅有一个Create模板,保持其他参数不变生成视图如下:
后记
最后再补充下为什么要严格遵守“CodeTemplatesMvcView”这一目录结构,很简单,因为我们是在扩展视图模板,打开C:Program Files (x86)Microsoft Visual Studio 14.0Common7IDEExtensionsMicrosoftWebMvcScaffoldingTemplates你会发现vs默认视图模板都在其下的MvcView目录内,也就是说“CodeTemplatesMvcView”是和“TemplatesMvcView”相对应的,而Templates这个目录下还包含了其他模板,只要照着这种对应关系在项目建立模板就可以对其他模板进行扩展,例如在“TemplatesMvcControllerEmpty”下有个“Controller.cs.t4”,她是我们新建空控制器的模板,在项目内建立“CodeTemplatesMvcControllerEmpty"目录,然后建立自己的“Controller.cs.t4”就可以实现自定义的空控制器了。