【问题标题】:dotLiquid: modulo-calculation not working as expecteddotLiquid:模计算未按预期工作
【发布时间】:2015-11-26 08:33:14
【问题描述】:

所以我在我的项目中使用 dotLiquid (1.8.0) 来创建一些 HTML 模板,这些模板用于通过 EO.pdf 创建 PDF

所以基本上,我想检查一个天数(== 日期)数组的给定日期是否在一周内,并在每周之后添加一个分页符。

为了让我的问题更清楚,下面是相关代码:

{% for day in plan.Days %}
   ...
    <table>
        <tbody>
            <tr class="footnote">
                <td>** Debug:</td>
            </tr>
            <tr><td>Index:  {{forloop.index}}, DateTypeChoice: {{plan.DateTypeChoice }}</td> <!-- just debug-statements -->
            </tr>
        </tbody>
    </table>

    {% assign endofweek = forloop.index | modulo: plan.DateTypeChoice %}
    <p>endofweek: {{endofweek}}</p>
    {%if endofweek == 0 %}
    <p>"dubididu Index: " {{forloop.index}}</p>
    <div style="page-break-before: always"></div>
    {% endif %}
{% endfor %}
</body>
</html>

plan.DateTypeChoice是一个整数值,包含一周中的天数(5 或 7 天)。它在我的 Drop-Model 中定义为

    public int DateTypeChoice { get; set; }

现在在我的测试场景中,调试语句(IndexDateTypeChoice)显示了我期望的值,但实际上 endofweek 包含例如(见下文)5 而不是 0我不知道为什么会这样。

示例输出为:

** Debug:
Index:  5, DateTypeChoice: 5
endofweek: 5 // This should be 0 imho

我也尝试将括号放在作业中,例如

    {% assign endofweek = (forloop.index | modulo: plan.DateTypeChoice) %}

然后我得到一个错误抛出(值不能为 NULL)。

我希望有人可以在这里帮助我。也许我使用模数错误?据我所知,forloop.index 是一个数值,从模型给模板的数值也被解析器视为数值,所以我没有想法。

编辑:

基于this 线程,我尝试使用捕获而不是分配,但结果相同。代码:

{% capture endofweek %} {{ forloop.index | modulo: plan.DateTypeChoice }}{% endcapture %}

    <p>"endofweek: " {{endofweek}}</p> //again 5 :-(
    {%if endofweek == 0 %}

非常感谢您的帮助 :-)

【问题讨论】:

  • 嗯,我记得过滤器不适用于assign 标签。而 IIRC,capture 值始终是字符串。不确定这是否可行,但您可以尝试在if 标签中使用内联过滤器:{%if (forloop.index | modulo: plan.DateTypeChoice) == 0 %}
  • 感谢您的评论。我刚试过,很奇怪,它总是(!)被击中,不仅仅是每 5 次左右。尽管在 if 条件下,我输出了相同的计算,但它告诉我它不是 0。非常奇怪的行为。另外,我尝试只添加简单的旧{{ 3 | modulo:2 }} ,从我模板中某处的液体文档中复制出来,但我得到的是1,而不是3。似乎只是未应用过滤器,因此解析器仅使用第一个参数。我在 google 组中为 dotliquid 创建了一个帖子,希望那里的人可以提供帮助。现在,我认为我必须重构我的模型。

标签: c# template-engine liquid modulo dotliquid


【解决方案1】:

终于找到了解决办法……

重新分析后,我发现我的模板中确实应用了 no 过滤器。也就是说,我找到了正确的解决方案here

我正在使用

Template.NamingConvention = new DotLiquid.NamingConventions.CSharpNamingConvention();

也是如此,所以在将modulo:更改为Modulo 大写M后,一切正常.. 叹息

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2016-08-13
    • 1970-01-01
    相关资源
    最近更新 更多