Methods/functions 在 t4 模板中 return html

Methods/functions in t4 templates to return html

我有一个大型 t4 文本模板要生成 html。

t4 模板:

<#@ template language="C#" debug="true" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="System.Globalization" #>


<#@ parameter type="Transaction" name="transaction" #>
<#@ parameter type="System.Collections.Generic.Dictionary<string,string>" name="resources" #>

<html>
<p>test paragraph1 </p>
<# foreach (TransactionItem t in transaction) { #>
    <p><#= t.Item #> <#= t.Price #></p>
<# } #>
<p>test paragraph2 </p>
<p>test paragraph3</p>
<p>
<#= this.GetClearanceReturnDate(14); #></p>
</html>

是否可以在 t4 模板中创建 methods/functions 以 return 大量文本,例如html tables/rows 要在 t4 模板中使用?

我知道我可以添加 'simple' 方法来计算和 return 'simple' 值,例如

<#+
    public string GetReturnDate(string days)
    {
        var d = Convert.ToDouble(days);

        var returnDate = DateTime.Now.AddDays(d).ToString("ddd dd-MMM-yy");

        return returnDate.ToUpper();
    }
#>

上述方法会return一个字符串格式的日期。

但是,在我的 t4 模板示例中,我想创建一个 method/function 到 return 多行 html 代码,以便我可以在多个地方重用它:

<# foreach (TransactionItem t in transaction) { #>
    <div>
    <p><#= t.Item #></p>
    <p><#= t.Price #></p>
    </div>
<# } #>

我认为最简单的方法是为您的模板创建一个支持 DLL。在单元测试中测试所需的功能,然后以与此类似的方式引用您的支持 DLL...

<#@ assembly name="$(SolutionDir)[Project Name]\bin\Debug\[Project Name].dll" #>

在此示例中,[项目名称] 是您的支持项目的名称。引用后,在您的模板中实例化它,如下所示...

var supportProj = new [Project Name]();

然后像使用其他任何东西一样使用它 class。 此方法抽象了支持 DLL 中的复杂逻辑,使模板更易于理解。然后,支持 DLL 可以在其中包含一个方法,returns 您需要的项目。