java - 将参数传递给百里香片段会出错
问题描述
使用 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 一样 ><
解决方案
推荐阅读
- flutter - TabBarView 中的 Flutter ListView.builder 引发 hitTest 错误
- c# - Office 互操作通过任务计划程序运行
- automation - Cypress 是否支持与 DB2 数据库的交互?
- r - 将多个小标题导出到 XLSX -- 使用 deparse(substitute()) 时的 sheetName 问题
- android - 将音频文件转换为样本数组
- twilio - 列出 Twilio 电话号码时识别 Whatsapp 电话号码
- javascript - 如何在javascript中使用具有短签名的密钥对数据进行签名
- file - Flutter:Google Drive:文件列表总是返回我 0
- c# - 不属于 windows 组或活动目录的人将如何访问 TFS 项目?
- batch-file - 如何在 Windows 批处理文件中指定打开 spyder、更改工作目录并运行脚本?