动软模板使用流程
模板的大体分为5块内容:模板指令声明,代码语句块,表达式块,类功能控制块,文本块输出。下面我们分别来介绍一下这5块内容的语法和使用说明。
- 模板指令声明块 <#@ #>
和ASP.NET页面的指令一样,它们出现在文件头,通过<#@…#>表示。其中<#@ template …#>指令是必须的,用于定义模板的基本属性。
(1) 模板指令
<#@ template [language="VB"] [hostspecific="true"] [debug="true"] [inherits="templateBaseClass"] [culture="code"] [compilerOptions="options"] #>
例如
<#@ template language="C#v3.5" hostSpecific="true" debug="true" #>
Language 这里可以指定模板使用的语言。
hostSpecific="true" 表示是否使用特定的host,host里面包含了模板使用的各种对象。
注意:
所有属性值必须用双引号都括起来。如果值本身包含引号,则必须使用 \ 字符对这些引号进行转义。 指令通常是模板文件或包含的文件中的第一个元素。
(2) 参数指令
<#@ parameter type="Full.TypeName" name="ParameterName" #>
(3) 输出指令
<#@ output extension=".fileNameExtension" encoding="encoding" #>
- output extension=".cs" 指定生成文件的扩展名。
encoding="encoding" 指定生成文件的编码。
(4) 程序集指令
<#@ assembly name="System.Data" #>
用于添加程序集引用,如果要使用第三方程序集,那么最好在项目中添加引用。
注:您应使用绝对路径的名称,或者路径名称中使用标准的宏的名称。
例如: <#@ assembly name="$(SolutionDir)library\MyAssembly.dll" #>
(5) 导入指令
<#@ import namespace="System.Data" #>
导入要使用的命名空间,注意:这里的命名空间必须要在前面指定的程序集里面找得到的,比如我指定命名空间"System.Data","System.Data.Common",这些在程序集System.Data中都有的
(6) 包含指令
<#@ include file="test.tt" #> 导入模板,类似Html的include用法
include 指令插入其他模板文件的文本。
例如,下面的指令插入 test.txt 的内容。 <#@ include file="c:\test.txt" #>
在处理时,被包含内容就像是包含文本模板的组成部分一样。 不过,即使 include 指令后跟普通文本块和标准控制块,也可以包含编写有类功能块 <#+...#> 的文件
- 代码语句块: <# #>
在模板文件中,可以混合使用任意数量的文本块和标准控制块。中间是一段通过相应编程语言编写的程序调用,我们可以通过代码语句快控制文本转化的流程。
注意:不能在控制块中嵌套控制块。
<#@ output extension=".txt" #>
<#
for(int i = 0; i < 4; i++)
{
#>
Hello!
<#
}
#>
- 表达式块:<#= #>
表达式控制块计算表达式并将其转换为字符串。 该字符串将插入到输出文件中。
例如: <#= 2 + 3 #>
表达式可以包含作用域中的任何变量。 例如,下面的块输出数字行:
<#@ output extension=".txt" #>
<#
for(int i = 0; i < 4; i++)
{
#>
This is hello number <#= i+1 #>: Hello!
<#
}
#>
- 类功能控制块:<#+ #>
如果文本转化需要一些比较复杂的逻辑,我们需要写在一个单独的辅助方法中,甚至是定义一些单独的类,我们就是将它们定义在类特性块中。类功能控制块定义属性、方法或不应包含在主转换中的所有其他代码。 类功能块常用于编写帮助器函数。 通常,类功能块位于单独的文件中,这样它们可以包含在多个文本模板中。 类功能控制块以 <#+ ... #> 符号分隔。
例如,下面的模板文件声明并使用一个方法:
<#@ output extension=".txt" #>
Squares:
<#
for(int i = 0; i < 4; i++)
{
#>
The square of <#= i #> is <#= Square(i+1) #>.
<#
}
#>
That is the end of the list.
<#+ // Start of class feature block
private int Square(int i)
{
return i*i;
}
#>
类功能必须编写在文件末尾。不过,即使 include指令后跟标准块和文本,也可以 <#@include #> 包含类功能的文件。例如下面代码则会报错:
List of Squares:
<#
for(int i = 0; i < 4; i++)
{ WriteSquareLine(i); }
#>
End of list.
<#+ // Class feature block
private void WriteSquareLine(int i)
{
#>
The square of <#= i #> is <#= i*i #>.
<#
}
#>