每次使用“添加视图”或“添加控制器”功能时,您都在 ASP.NET MVC 项目中使用 T4 模板。这些模板位于 Common7\IDE\ItemTemplates\CSharp\Web\MVC 2\CodeTemplates 文件夹的 Visual Studio 安装中。另外还提供了模板的 Visual Basic 版本,但是我将其作为读者推断文件夹名称的一个练习。

这些模板本身足以说明 T4 的价值和功能。例如,以下是 CodeTemplates 的 AddView 子文件夹中 List.tt 的一段摘录:

if(!String.IsNullOrEmpty(mvcViewDataTypeGenericString)) {
Dictionary<string, string> properties =
new Dictionary<string, string>();
FilterProperties(mvcHost.ViewDataType, properties);
#>
<table>
<tr>
<th></th>http://util.cnblogs.com/InsertCode.aspx
<#
foreach(KeyValuePair<string, string> property in properties) {
#>
<th>
<#= property.Key #>
</th>
<#
}
#>

  

List.tt 的工作是生成将以表格形式显示模型对象集合的 .aspx 文件。在该模板中,您可以看到编写的表、tr 和 th 标记。若要生成 .aspx 文件,该模板需要一些上下文信息,例如,应使用的母版页的名称和模型的类型。该模板可以从其宿主对象检索此信息。该宿主对象位于模板和 T4 引擎之间,并可以使模板访问资源(如本地文件)和环境设置。通常,宿主是 Visual Studio,但 MVC 团队在 Microsoft.VisualStudio.Web.Extensions 程序集中创建了类型为 MvcTextTemplateHost 的自定义宿主。这便是沿用了您在“添加视图”和“添加控制器”对话框中输入的信息的自定义宿主对象,这些对话框是您将发现的最接近 MVC 项目中的向导的事物。

List.tt 将遍历强类型化模型对象的可显示属性并创建具有每个属性列的表。该模板使用反射在 FilterProperties 方法中查找该模型的可用属性。FilterProperties 是稍后在模板文件中定义的帮助器方法。该模板还设置了导航到编辑和详细信息操作的链接,并根据您正在创建视图还是部分视图来为 .aspx 设置适当的 @ Page 或 @ Control 指令。

当模板结束运行时,您将看到一个崭新的 .aspx 视图,该视图包含显示模型对象集合所需的所有内容。您可能会打开 .aspx 文件并进行微调以使该视图在外观上与应用程序其余部分中的视图保持一致。

如果您发现总是对这些生成的视图(或 Controller.tt 生成的控制器代码)进行相同的更改,则可以通过修改模板本身来节省时间。例如,您可以修改内置模板,以便为项目中使用的样式规则甚至更重要的内容添加类属性。请记住,修改 Visual Studio 安装目录中的模板文件将更改在您的计算机上进行的所有项目中生成的代码。如果您希望更改为单个项目生成的代码,您也可以这样做。

各个项目 T4 自定义

如果您想要基于各个项目的代码生成模板的自定义版本,则首先复制 Visual Studio 安装中的 CodeTemplates 文件夹,然后将其粘贴到您的 ASP.NET MVC 项目的根目录中。然而,不必将所有模板都复制到您的项目中。您可以只复制需要修改的模板。共有 6 个 MVC 代码生成模板,1 个用于添加控制器 (Controller.tt),其余 5 个用于添加视图(Create.tt、Details.tt、Edit.tt、Empty.tt、List.tt)。如果您的项目中存在模板,则该模板将覆盖 Visual Studio 安装目录中的模板。

当向 Visual Studio 解决方案中添加 .tt 文件时,IDE 会自动将该 .tt 文件分配给 TextTemplatingFileGenerator 的自定义工具设置。如果您创建了我之前所述的 Simple.tt 模板,则您已看到这种情况。但是,这不是 MVC T4 模板的适当设置。Visual Studio 的 MVC 工具将在适当的时候调用这些模板并在模板处理期间创建特殊的 MvcTextTemplateHost 对象。因此,将模板复制到您的项目中后,第二步是为各个模板文件打开“属性”窗口,然后删除“自定义工具”设置(保留该设置为空)。此时,便可以自定义您的模板了。

---------------------------------------------------------------------------------------------------------------------------

MvcTextTemplateHost 属性
请注意,并非 MvcTextTemplateHost 对象上的所有属性都适用于每个上下文。这些模板将在您调用“添加视图”和“添加控制器”上下文菜单项时得以执行。这两种操作均可使用 Namespace 属性并将其设置为适当的值。但是,MasterPage 属性在“添加视图”操作期间仅被设置为有效值并包含用户在“添加视图”对话框中为 MasterPage 名称输入的值。
---------------------------------------------------------------------------------------------------------------------------
例如,假设您不希望控制器执行索引操作。而更希望使用默认操作 List。您可以打开 CodeTemplates\AddController 文件夹中的 Controller.tt 模板,并将代码的相应区域更改为如下内容:
public class <#= mvcHost.ControllerName #> : Controller
{
// GET: /<#= mvcHost.ControllerRootName #>/ public ActionResult List()
{
return View();
}
...

  

这是一个简单的更改,但可为您和您的团队在整个大型项目生命周期内节省相当多的时间。

更进一步—T4MVC

2009 年夏天,ASP.NET 团队的 David Ebbo 创建了 T4MVC,一种 T4 模板,专用于在 ASP.NET MVC 应用程序中生成强类型化帮助器。随着时间的推移,Ebbo 已对该模板进行了完善,您现在可以从aspnet.codeplex.com/wikipage?title=T4mvc 下载该模板。

T4MVC 模板是传统的 T4 模板。将 T4MVC.tt 及其关联的设置文件 (T4MVC.settings.t4) 添加到您的项目,该项目将使用 TextTemplatingFileGenerator 自定义工具生成 C# 代码。T4MVC 将帮助您消除 MVC 应用程序中的许多奇妙的字符串文本。例如,模板将执行的一项任务是扫描项目中的 Content 和 Scripts 文件夹并生成具有静态属性的类以表示各个脚本和内容片段。

生成的代码意味着您可以呈现由带有该代码的默认 MVC 项目提供的 LogOnUserControl 部分视图:

<% Html.RenderPartial(MVC.Shared.Views.LogOnUserControl); %>
之前,您可能已使用了字符串文本:
<% Html.RenderPartial("LogOnUserControl"); %>

如果有人重命名、移动或删除 LogonUserControl,则强类型化代码将在编译视图时生成编译错误。除了对视图和部分视图的强类型化访问外,T4MVC 模板还提供了对 Content 和 Scripts 文件夹中的所有文件以及控制器和控制器操作的强类型化访问。

您可以在建立操作链接、返回查看结果,甚至在为应用程序构建路由表时使用 T4MVC 生成的类。请注意,当首次向项目中添加 T4MVC 时,您将看到在 IDE 的“错误列表”窗口中生成的一些警告。这些警告只是 T4MVC 向您介绍应用到代码的某些更改。其中大部分更改不会改变应用程序的行为;T4MVC 模板只向控制器类定义中添加某些局部关键字并使非虚拟操作方法变为虚拟方法。有关 T4MVC 的详细信息,请查看 Ebbo 的博客,网址为 blogs.msdn.com/davidebb

T4 是 Visual Studio 中非常神奇的财富,但还不是广为人知的模板。本文为您提供了在 ASP.NET MVC 项目中开始使用自定义模板所需的一切内容。希望您还能发现 T4 模板在 Web 应用程序项目之外的其他用途。您还应该在项目中试用 T4MVC 模板,因为这些模板可使您的代码更易于维护和重构。展望未来,Visual Studio 2010 中的 T4 技术将添加专用的项目模板和预编译模板,从而更趋完善。

转载 :https://msdn.microsoft.com/zh-sg/magazine/ee291528.aspx


ASP.NET MVC 中的 T4的更多相关文章

  1. 2.ASP.NET MVC 中使用Crystal Report水晶报表

    上一篇,介绍了怎么导出Excel文件,这篇文章介绍在ASP.NET MVC中使用水晶报表. 项目源码下载:https://github.com/caofangsheng93/CrystalReport ...

  2. 关于 ASP.NET MVC 中的视图生成

    在 ASP.NET MVC 中,我们将前端的呈现划分为三个独立的部分来实现,Controller 用来控制用户的操作,View 用来控制呈现的内容,Model 用来表示处理的数据. 从控制器到视图 通 ...

  3. 在Asp.Net MVC 中配置 Serilog

    Serilog 是一种非常简便记录log 的处理方式,使用Serilog可以生成本地的text文件, 也可以通过 Seq 来在Web界面中查看具体的log内容. 接下来就简单的介绍一下在Asp.Net ...

  4. 如何在 ASP.NET MVC 中集成 AngularJS(3)

    今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容. 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后,我意识到,我必须提供两个版本的路由表 ...

  5. 如何在 ASP.NET MVC 中集成 AngularJS(2)

    在如何在 ASP.NET MVC 中集成 AngularJS(1)中,我们介绍了 ASP.NET MVC 捆绑和压缩.应用程序版本自动刷新和工程构建等内容. 下面介绍如何在 ASP.NET MVC 中 ...

  6. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  7. asp.net mvc 中 一种简单的 URL 重写

    asp.net mvc 中 一种简单的 URL 重写 Intro 在项目中想增加一个公告的功能,但是又不想直接用默认带的那种路由,感觉好low逼,想弄成那种伪静态化的路由 (别问我为什么不直接静态化, ...

  8. 在 ASP.NET MVC 中充分利用 WebGrid (microsoft 官方示例)

    在 ASP.NET MVC 中充分利用 WebGrid https://msdn.microsoft.com/zh-cn/magazine/hh288075.aspx Stuart Leeks 下载代 ...

  9. ASP.NET MVC中的两个Action之间值的传递--TempData

    一. ASP.NET MVC中的TempData 在ASP.NET MVC框架的ControllerBase中存在一个叫做TempData的Property,它的类型为TempDataDictiona ...

随机推荐

  1. mongoose post方法总结and疑点

    官方文档代码: var schema = new Schema(..); schema.post('save', function (doc) { console.log('this fired af ...

  2. 学习使用React Native的心得体会

    首先根据官网上的介绍,安装必须的环境需求.http://reactnative.cn/docs/0.20/getting-started.html#content 下面讲一下一些常用的命令: .下载n ...

  3. 愤怒的DZY(二分)

    愤怒的DZY[问题描述]“愤怒的小鸟”如今已经是家喻户晓的游戏了,机智的WJC最近发明了一个类似的新游戏:“愤怒的DZY”.游戏是这样的:玩家有K个DZY,和N个位于不同的整数位置:X1,X2,…,X ...

  4. hdu-4468-Spy-KMP+贪心

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4468 题目意思: 给你一个串r,求一个串s,使得s的前缀1+s的前缀2+s的前缀3+...+s的前缀 ...

  5. EJBCA认证系统结构及相关介绍

    写作此文的主要目的是记录下EJBCA认证系统的系统结构及相关部件作用的介绍,方便后面查阅使用.

  6. USACO Section 3.3 Camlot(BFS)

    BFS.先算出棋盘上每个点到各个点knight需要的步数:然后枚举所有点,其中再枚举king是自己到的还是knight带它去的(假如是knight带它的,枚举king周围的2格(网上都这么说,似乎是个 ...

  7. TCP的流量控制

    TCP协议作为一个可靠的面向字节流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现. 要区分TCP的流量控制和拥塞控制: 流量控制是发送方的发送数据的速 ...

  8. Struts学习之手动验证

    * 首先要从页面中获取对应的标签name属性的值,在动作类action中声明同名的属性,提供get和set方法    * 要继承ActionSupport类或者实现Validateable接口     ...

  9. mysql errno:13

    新装的mysql,创建表时报错误 errno:13,网上查了一下是权限问题.解决方式如下: 到mysql的数据目录下:即启动进程中:--datadir=/data/soft/mysql/mysqlda ...

  10. CSS3 Media Query

    在移动端火爆的今日,一个好的web应用不仅仅要有对应移动平台的APP,自己web网页也需要对不同屏幕大小的移动设备进行支持,也就是我们所说的响应式web页面. 本篇文章就来介绍下最常见的响应式页面的实 ...