T4文本模板:返回html表达式的方法

时间:2013-06-30 15:14:35

标签: c# t4

我有以下T4文本模板,并在很多地方重复:

<# if (!package.Name.Equals("Amazon")) {#>
    <td><#=package.Name#></td>
<#} else {#>
    <td><a href="<#=package.Name#>@Amazon.com"><#=package.Name#></a></td>
<#}#>

我想用一个函数替换它,如果package.Name等于Amazon,则返回带有href属性的字符串,例如:

 private static string ConvertPackageName(Package package)
 {
    if (!package.Name.Equals("Amazon"))
    {
       return package.Name;
    }

    return "<a href="<#=package.Name#>@Amazon.com"><#=package.Name#></a>";
 }

是否有可能有这样的东西,所以我可以得到这样的代码:

<td><#=ConvertPackageName(package)#></td>               

2 个答案:

答案 0 :(得分:1)

您需要使用class feature blocks<#+ /* code */ #>

答案 1 :(得分:1)

正如Athari所说,你需要使用class feature blocks。有一些问题你需要了解才能使它们运作良好。

  1. 必须将要素块中的所有语句块(<# #>)更改为要素块。这意味着您通常会使用<# #>标记,现在使用<#+ #>标记。 <#= #>代码仍可正常使用。

  2. 在第一个功能块之后,您不能拥有任何语句块。因此,您需要将函数放在模板文件的末尾。

  3. 以下是代码外观的示例:

    Some template code....
    <# ConvertPackageName(package); #>
    More template code...
    <# ConvertPackageName(package); #>
    ....
    
    <#+ void ConvertPackageName(Package package) { #>
        <#+ if (!package.Name.Equals("Amazon")) {#>
            <td><#=package.Name#></td>
        <#+} else {#>
            <td><a href="<#=package.Name#>@Amazon.com"><#=package.Name#></a></td>
        <#+}#>
    <#+}#>
    END OF TEMPLATE
    

    在ConvertPackageName中生成的文本将在您调用方法的任何地方注入,因此在您的示例中,您将拥有类似于<td><# ConvertPackageName(package); #></td>的模板代码