【问题标题】:T4 Text Templates: method to return html expressionT4 文本模板:返回 html 表达式的方法
【发布时间】:2013-07-18 04:34:41
【问题描述】:

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

【问题讨论】:

    标签: c# t4


    【解决方案1】:

    你需要使用class feature blocks:&lt;#+ /* code */ #&gt;

    【讨论】:

      【解决方案2】:

      正如 Athari 所说,您需要使用 class feature blocks。不过,您需要了解一些问题才能让它们正常工作。

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

      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 中生成的文本将被注入到您调用该方法的任何位置,因此在您的示例中,您将拥有类似于 &lt;td&gt;&lt;# ConvertPackageName(package); #&gt;&lt;/td&gt; 的模板代码

      【讨论】:

        猜你喜欢
        • 2018-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多