MVC开发T4代码生成之二----vs模板扩展
在上一篇MVC开发T4代码生成之一----文本模板基础中介绍了与T4模板相关的基础知识,并对MVC内使用T4模板添加视图做了介绍。知道了T4模板的使用后自然就想着怎么对vs自带的T4模板进行扩展,添加一些我们自定义的T4模板。有两种途径可以对vs的T4模板进行扩展:
a.直接在vs模板目录内(C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding\Templates\MvcView)添加,这种方法添加的 模板属于IDE级,可以应用在所有项目内;b.在项目内新建“CodeTemplates\MvcView”目录,在其中添加模板,这种方法添加的模板仅应用与所在项目。下面分别对这两种方法进行介绍。
在vs模板目录内添加T4模板
这种添加很简单,只需将添加T4模板文件并按照文件命名规则命名就可以,C#的就以.cs.t4命名,vb的就以.vb.t4命名,添加完成后在vs模板内就多出了我们新添加的,例如我们在目录内新添加了一个Test.cs.t4模板,添加无需重启vs即可,并且添加的模板在所有项目内均可使用。
添加前后vs内模板变化如图所示:


在项目内新建“CodeTemplates\MvcView”目录添加模板
有时我们希望建立一个仅用于项目内使用的T4模板,例如我们认为vs自带的List模板不适于项目,于是自定义了一个新的List模板,新的List模板仅用于当前项目,如果在vs目录内添加那我们就需要在新List模板文件名称上添加必要信息与原有List模板做区分,等时间长了添加多了后在vs内新建视图时就会出现一堆List模板,然后每次添加都要进行区分,显然这样很不明智,我们也不能随意替换或删除某个List模板,因为他们可能被其他项目使用了。
建立仅用于项目内使用的T4模板步骤很简单,只需要在项目内添加“CodeTemplates\MvcView”目录结构,然后在其中添加T4模板即可,即使新添加的模板与vs目录内模板重名在使用时也会以项目内模板生成,此时也不会对vs目录内模板造成影响。需要注意的是目录结构必须与“CodeTemplates\MvcView”一致,另外如果新建T4模板需要使用vs自带的Imports和ModelMetadataFunctions模板文件时,新建T4模板相应的include指令要使用绝对目录或者把vs目录内的Imports和ModelMetadataFunctions模板文件复制到项目CodeTemplates\MvcView目录内。
例如我们使用如下TestViewModel视图模型生成分布视图,TestViewModel内容如下:
public class TestViewModel
{
public string Name { get; set; }
public string Age { get; set; }
}
首先使用vs自带的Create模板生成视图,生成视图时的对话框配置如下:

生成的视图如下:

然后我们在项目内新建“CodeTemplates\MvcView”目录结构,将vs目录内的Imports.include.t4和ModelMetadataFunctions.cs.include.t4模板文件复制到项目CodeTemplates\MvcView目录内,在项目内“CodeTemplates\MvcView”下新建文本文件并改名为Create.cs.t4,至于模板内容我们直接复制vs自带的Create.cs.t4内容将其中“<h4><#= ViewDataTypeShortName #></h4>“修改为”<h4><#= ViewDataTypeShortName #>---这是由项目内Create模板生成的视图</h4>“然后保存重新生成视图:

此时可以看到在模板选项内仅有一个Create模板,保持其他参数不变生成视图如下:

后记
最后再补充下为什么要严格遵守“CodeTemplates\MvcView”这一目录结构,很简单,因为我们是在扩展视图模板,打开C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding\Templates你会发现vs默认视图模板都在其下的MvcView目录内,也就是说“CodeTemplates\MvcView”是和“Templates\MvcView”相对应的,而Templates这个目录下还包含了其他模板,只要照着这种对应关系在项目建立模板就可以对其他模板进行扩展,例如在“Templates\MvcControllerEmpty”下有个“Controller.cs.t4”,她是我们新建空控制器的模板,在项目内建立“CodeTemplates\MvcControllerEmpty"目录,然后建立自己的“Controller.cs.t4”就可以实现自定义的空控制器了。
MVC开发T4代码生成之二----vs模板扩展的更多相关文章
- MVC开发T4代码生成之一----文本模板基础
T4文本模板 T4全写为Text Template Transformation Toolkit,是一种编程辅助工具,用来使程序代码自(懒)动(猿)生(福)成(利)的工具.MVC开发中大量使用了T4模 ...
- LibOpenCM3(二) 项目模板 Makefile分析
目录 LibOpenCM3(一) Linux下命令行开发环境配置 LibOpenCM3(二) 项目模板 Makefile分析 LibOpenCM3 项目模板 项目模板地址: https://githu ...
- T4 模板 : 一种提升ASP.NET MVC开发速度方法
最近由于需要在框架中提供一些自定义模板的功能,找到了一篇博客,可惜似乎是翻译工具直接翻的,读不通顺,就试着自己翻译下,我不会完全翻译原文的句子,可能会对原文进行小范围的我认为更合适的句子并添加些注释, ...
- ASP.Net MVC开发基础学习笔记:五、区域、模板页与WebAPI初步
一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...
- ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步
一.区域—麻雀虽小,五脏俱全的迷你MVC项目 1.1 Area的兴起 为了方便大规模网站中的管理大量文件,在ASP.NET MVC 2.0版本中引入了一个新概念—区域(Area). 在项目上右击创建新 ...
- Extjs 6 MVC开发模式(二)
1.Extjs MVC开发模式 在JS的开发过程中,大规模的JS脚本难以组织和维护,这一直是困扰前端开发人员的头等问题.Extjs为了解决这种问题,在Extjs4.x版本中引入了MVC开发模式,开始将 ...
- 《ASP.NET MVC企业实战》(二) MVC开发前奏
在上一篇“<ASP.NET MVC企业级实战>(一)MVC开发前奏”中记录了作者介绍的一些比较实用的VS使用方法以及C#2.0中添加的新特性.本篇继续大概了解之后版本的一些新特性. ...
- 解析ASP.NET WebForm和Mvc开发的区别
因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...
- 解析ASP.NET Mvc开发之查询数据实例
目录: 1)从明源动力到创新工场这一路走来 2)解析ASP.NET WebForm和Mvc开发的区别 ------------------------------------------------- ...
随机推荐
- mfc添加自定义事件
1.在对话框的头文件里面添加声明函数: afx_msg void OnStnClickedPicStop(); 2.在对话框的源文件添加 BEGIN_MESSAGE_MAP(CPcEn3dTestDl ...
- dubbo 调用服务超时
先贴出错误报告: Failed to invoke the method *** in the service ***. Tried times of the providers [] (/) on ...
- Linux背背背(6)
目录 1.用户 2.用户组 3.权限设置 用户管理 添加用户 命令:useradd 语法:#useradd 用户名 所有的用户添加之后都会存储在一个文件中,会存储在passwd文件中,位置位于/etc ...
- Linux系统的RAID磁盘阵列
RAID概念 磁盘阵列(Redundant Arrays of Independent Disks,RAID),有“独立磁盘构成的具有冗余能力的阵列”之意. 磁盘阵列是由很多价格较便宜的磁盘,以硬件( ...
- js关闭浏览器
不存在的 告诉策划:不好意思,这个需求实现不了. 旧版本浏览器有些支持window.close()方法,目前主流浏览器都不支持,就算让你 ...
- Windows环境下在sublime text3配置C编译环境
1. 检查本机有没有安装GCC,没有的话先进行安装 2. 选择 sublime 的Tools->Build System->New Build System,建立配置文件,文件命名为C.s ...
- Python threading(多线程)
threading模块在较低级别thread模块之上构建更高级别的线程接口. 一.threading模块定义了以下函数和对象: threading.active_count() 等同于threadin ...
- react-native上手篇
根据公司发展,后期可能要做APP开发,所以了解一下react-native.之前工作用过react,所以想想应该不会太难.(结果配置环境和demo就搞了一天!) 1,搭建环境 官网地址 1,Node( ...
- 文件系统的描述信息-/etc/fstab
/etc/fstab文件包含众多文件系统的描述信息.文件中每一行为一个文件系统的描述,每行的选项之间通过tab分隔,#开头的行会被转换为注释,空白行会被忽略./etc/fstab文件中的设备顺序很重要 ...
- jquery调用iframe里面的方法
$(window.parent.document).contents().find("#iframename")[0].contentWindow.iframefunction() ...