2

我有以下 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>               
4

2 回答 2

1

正如 Athari 所说,您需要使用类功能块。但是,您需要了解一些问题才能使它们正常工作。

  1. 功能块中的所有语句块 ( <# #>) 必须更改为功能块。这意味着在您通常使用<# #>标签的任何地方,您现在都使用<#+ #>标签。 <#= #>标签仍然可以正常工作。

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

这是您的代码外观的示例:

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>

于 2013-07-17T20:34:41.597 回答
1

您需要使用类功能块<#+ /* code */ #>

于 2013-06-30T16:51:47.933 回答