首页 > 解决方案 > 将参数传递给百里香片段会出错

问题描述

使用 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>

现在我把代码放在一个 thymeleaf 片段中,然后用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:Bean 名称“mcCheckedChoices”的 BindingResult 和普通目标对象都不能用作请求属性

我错过了什么?为什么

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出在 -- 与 thymeleaf+spring 一样 ><

标签: javaspring-mvcthymeleafspring-el

解决方案


推荐阅读