将参数传递给百里香片段会产生错误

问题描述 投票:0回答:1

使用Spring和Thymeleaf 3,我陷入了困境。

我有一个多复选框html代码块,我想重用:所以我希望将它放在一个片段中。

无片段代码运行得很好:

<div>
<h5 th:text="#{sg.multi-checkbox}"></h5>
<div class="field-box--wrapper">
    <script type="text/javascript"
            charset="utf8"
            th:src="@{/static/js/components/multichoice.js}"></script>
    <div class="field-box"
         th:each="attr, stat: ${allAttributs}"
         th:classappend="${!attr.nonModifiable && !dummy.isEdit()} ? 'field-hide'">
        <div th:if="${dummy.isEdit() || #arrays.contains(dummy.attributsCoches, attr.id)}">
            <input type="checkbox"
                   th:readonly="${attr.nonModifiable}"
                   th:field="${dummy.attributsCoches}"
                   th:value="${attr.id}"
            />
            <label th:for="${'attributsCoches' + __${stat.index + 1}__}"
                   th:text="${attr.nom}">label</label>
            <i class="fa fa-plus"></i>
            <i class="fa fa-check"></i>
        </div>
    </div>
</div>

现在,我将代码放在百里香片段中,并用th:replace进行调用。由于它是一个片段,因此可以在代码中的任何地方重用,因此我无法保留用于测试开发的变量名。很好,因为文档解释了如何做到这一点“为了为模板片段创建更类似于函数的机​​制,用th:fragment定义的片段可以指定一组参数:” https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#template-layout

所以我做到了:

片段

<div th:fragment="multichoix(mcTitle, mcAllChoices, mcIsEdit, mcCheckedChoices, mcCheckedChoicesName    )">
<h5 th:text="${mcTitle}"></h5>
<div class="field-box--wrapper">
    <script type="text/javascript"
            charset="utf8"
            th:src="@{/static/js/components/multichoice.js}"></script>
    <div class="field-box"
         th:each="attr, stat: ${mcAllChoices}"
         th:classappend="${!attr.nonModifiable && !mcIsEdit} ? 'field-hide'">
        <div th:if="${mcIsEdit || #arrays.contains(mcCheckedChoices, attr.id)}">
            <input type="checkbox"
                   th:readonly="${attr.nonModifiable}"
                   th:field="${mcCheckedChoices}"
                   th:value="${attr.id}"
            />
            <label th:for="${mcCheckedChoicesName + __${stat.index + 1}__}"
                   th:text="${attr.nom}">label</label>
            <i class="fa fa-plus"></i>
            <i class="fa fa-check"></i>
        </div>
    </div>
</div>

[我用:调用片段(在同一页面,使用相同模型)

<!--   Fragmented multicheckbox       -->
        <div th:replace="styling/html-component/atomic/multichoix :: multichoix(mcTitle='a',
            mcAllChoices=${allAttributs},
            mcIsEdit=${dummy.isEdit()},
            mcCheckedChoices=${dummy.attributsCoches},
            mcCheckedChoicesName='attributsCoches')">
            multichoix fragment
        </div>

我有

java.lang.IllegalStateException:既不是BindingResult也不是简单的Bean名称“ mcCheckedChoices”的目标对象可用作请求属性

我想念什么?为什么

dummy.attributsCoches

处理不正确?

如果将dummy.attributsCoches放入片段中(因此没有中间变量),则显然可以。

dummy.attributsCoches是Getter&Setter的私人列表。

编辑:如果我不带参数名传递参数,则不起作用:

<!--   Fragmented multicheckbox       -->
        <div th:replace="styling/html-component/atomic/multichoix :: multichoix(
            'a',
            ${allAttributs},
            ${dummy.isEdit()},
            ${dummy.attributsCoches},
            'attributsCoches')">
            multichoix fragment
        </div>

编辑:所以问题出在th:field上,就像百里香+弹簧> <

一样
java spring-mvc thymeleaf spring-el
1个回答
0
投票

如果要预先填充某些复选框,则可能需要使用Thymeleaf fixed-value booleans

© www.soinside.com 2019 - 2024. All rights reserved.