Thymeleaf带参数fragment调用时内部元素及参数绑定失效如何解决?
问题成因
这一问题的核心是th:text属性的渲染逻辑导致的:th:text会直接替换其所在标签的全部子内容,包括内嵌的子元素、文本节点等,仅保留th:text指定的文本值。
你代码中th:text="${label}"写在了<label>标签上,因此<label>内部原本定义的两个单选框元素会被直接覆盖,仅渲染label参数的文本内容。参数本身的传递是正常的,从渲染结果中Name文本正确展示就能验证这一点。
解决方法
调整Fragment定义结构,不要在父级<label>标签上使用th:text即可,可选方案有两种:
- 将文本展示逻辑拆分到独立的内嵌
<span>标签中,修改后的Fragment示例如下:
<div th:fragment="sort (label,field)"> <label> <span th:text="${label}">Label</span> <input th:name="'sort-' + ${field}" type="radio" value="asc"/> <input th:name="'sort-' + ${field}" type="radio" value="dsc"/> </label> </div>
- 使用Thymeleaf文本内联语法,不需要额外新增标签:
<div th:fragment="sort (label,field)"> <label> [[${label}]] <input th:name="'sort-' + ${field}" type="radio" value="asc"/> <input th:name="'sort-' + ${field}" type="radio" value="dsc"/> </label> </div>
修改后原有调用方式不需要做任何调整,渲染结果会正常包含label文本和两个对应name属性的单选框。
内容的提问来源于stack exchange,提问作者Bogdan Tischenko
相关产品推荐
相关产品推荐

