T4 就像旧的 asp 页面。在 Visual Basic 上使用诸如 php 或 asp 之类的脚本来考虑所有这些 的东西。他们创造了一个“输出”。比输出可以是任何东西。但是,他们可以访问您的项目,因此他们可以使用您的课程的一些信息。所以我假设你已经有一些这样做的经验,在任何脚本语言上。
您真的应该遵循以下教程:
[https://msdn.microsoft.com/en-us/library/bb126445.aspx]
好的,我们走吧。
当您创建一个新项目时,您有一个模型、一个视图和一个控制器的目录(以及其他目录)。
首先在 Model 中创建一个小类:
public class CarsModel
{
public string Brand {get;set;}
public string Model {get;set;}
[Display(Name="Kilometers per hour")]
public double Speed {get;Set;}
}
进入那里并打开 HomeController。添加新方法:
public ActionResult MyList()
{
List<CarsModel> myList = new List<CarsModel>();
myList.Add( new CarsModel() { Brand = "Ford", Model = "F50", Speed = 150} );
myList.Add( new CarsModel() { Brand = "Lamborgini", Model = "Countach", Speed = 290} );
myList.Add( new CarsModel() { Brand = "Mattel", Model = "RedShadow", Speed = 5} );
return View(myList);
}
现在,编译。右键单击 MyList() 并选择“添加视图”(通常是上下文菜单上的第一个或第二个选项)。如图填写(我的是西班牙语,但一定要清除数据库上下文)
单击确定。 T4 将为您创建一个视图。太好了,对吧?
让我们看看它是如何工作的。
在您的项目中,在您的 Web 项目的根目录上创建一个 [ CodeTemplates ] 文件夹。
在里面创建另一个文件夹,[ MvcView ]。您应该以 [ CodeTemplates\MvcView ] 结尾。
现在我们将复制 Microsoft 的默认模板,以便您使用它们。
在资源管理器中打开 [ "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web\Mvc\Scaffolding\Templates\MvcView" ]。你应该看到一个文件列表:
将这些文件复制到您的项目中,在我们刚刚创建的文件夹中 ([CodeTemplates\MvcView])
您可以自动创建代码、html、cshtml、txt...任何您想要的。我现在将展示“列表”的工作原理。
在您的项目中打开“List.cs.t4”。如果修改有问题,可以复制原文件。
之间的所有内容都是代码,将被执行或评估。
让我们检查一些行。行号可能略有不同。
<#@ template language="C#" HostSpecific="True" #>
<#@ output extension=".cshtml" #>
<#@ include file="Imports.include.t4" #>
@model IEnumerable<#= "<" + ViewDataTypeName + ">" #>
第一个:我们将使用 c# 编写脚本(没有 vb)
第二个:扩展。很清楚,对吧?
第三个:我将使用一些例程:包含它们(Imports.include.t4 在同一目录中)
第四个:它将以下内容写入文件:
@Model IEnumerable **SomeGgeneratedCode**
SomegeneratedCode 是 "+ ViewDataTypeName + ">" #>。说:
写“”,或者[]
所以,它写了
@Model IEnumerable<CarsModel>
因此,这是您的视图的 MVC 模型。不错吧?
现在,让我们继续前进。
<#
// The following chained if-statement outputs the file header code and markup for a partial view, a view using a layout page, or a regular view.
if(IsPartialView) {
#>
<#
} else if(IsLayoutPageSelected) {
#>
// Generated code for a page with a layout (which is taken from the "Add View" dialog)
大约在第 40 行
<title><#= ViewName #></title>
[
第 48 行:
@Html.ActionLink("Create New", "Create")
你可以改变一些东西,比如我。例如,
@Html.ActionLink("Nuevo", "Create", { id = ViewBag.parentId }, new { @class = "btn btn-xs" })
这将创建一个不同的链接,用西班牙语,一个按钮的引导 css 和一个路由参数的 id,以防这是一个子视图:)。该组中没有 t4,只是硬编码个性化!
接下来的 53-56 行,你可以猜到在做什么。它搜索“主键”。我们的模型没有它,所以将被跳过。
第 74 行:正在将
| 写入一个表中。
我会为你“缩进”它。
@foreach (var item in Model) {
<tr>
<#
foreach (PropertyMetadata property in properties) {
if (property.Scaffold && !property.IsPrimaryKey && !property.IsForeignKey) {
#>
<#
// We do not want to show any association properties for which there is
// no associated foreign key.
if (property.IsAssociation && GetRelatedModelMetadata(property) == null) {
continue;
}
#>
<td>
@Html.DisplayFor(modelItem => <#= "item." + GetValueExpression(property) #>)
</td>
<#
}
}
.... more code ...
</tr>
}
所以,它在这里遍历我们模型的属性并为每个成员创建一个行标题。
如果您看到,在 之间是代码,而在 之间是“写入”或输出。第 88 行:
Html.DisplayFor(modelItem => <#= "item." + GetValueExpression(property) #>)
所以,假设我们现在正在编写“速度”列。它会写
Html.DisplayFor(modelItem => item.Speed)
我希望它足以开始。只需将新的 T4 添加到您的 Web 应用程序 (MvcViews) 中的该目录中,它将在“添加新视图”对话框中作为新模板提供。您可以将大部分繁琐的工作自动化。
T4 很难调试,所以每次都做些小改动并进行测试。 Visual Studio 有一些 t4 编辑器语法助手:
Tangible syntax highlight
Devart editor
我使用了 Tangible,但现在我将尝试 Devart。
告诉我你是怎么做的。