You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Thymeleaf自动设置name时覆盖input的name属性

解决方案

要实现按Group枚举分组选择单选按钮,同时保留Thymeleaf的数据绑定,核心是动态生成th:field的绑定路径——因为th:field优先级高于原生name属性,直接设置name无法覆盖自动生成的值。

1. 调整后台实体/DTO

新增一个Map类型的属性,用来接收每个组的选中值:

// 示例表单DTO
public class VacationSelectionForm {
    // key对应Group枚举的字符串值,value对应选中的day.id
    private Map<String, Long> groupSelectedDays;

    // 构造器、getter、setter自行补充
}

2. 修改Thymeleaf模板

把原固定的th:field="*{bonusVacationDay}"替换为动态绑定表达式,利用Thymeleaf的预处理语法(__${}__)先解析group变量值,再作为Map的键:

<div>
    <table th:each="group : ${groupsRadio}">
        <thead>
            <tr>
                <td th:text="${group}"></td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td th:each="day : ${bonusDays}"
                    th:if="${day.bonusDayGroup} == ${group}"
                >
                    <input
                            th:field="*{groupSelectedDays[__${group}__]}"
                            type="radio"
                            th:value="${day.id}"
                            th:text="${day.description}"
                    />
                </td>
            </tr>
        </tbody>
    </table>
</div>

原理说明

  • th:field="*{groupSelectedDays[__${group}__]}"会让Thymeleaf自动生成格式为groupSelectedDays[GROUP_VALUE]的name属性,每个组的单选按钮拥有独立name,确保每组仅能选择一个选项。
  • 表单提交时,各组选中的day.id会自动绑定到后台VacationSelectionForm的groupSelectedDaysMap中,key为Group的字符串值,value为选中的ID。

注意事项

  • 确保${group}的字符串值与后台Map的key类型匹配:如果Group是枚举,可统一使用group.name()或group.toString()的结果作为键。
  • 若后台需要直接用枚举作为Map的key,可在Thymeleaf中显式转换,例如__${T(com.yourpackage.Group).valueOf(group)}__,但通常用字符串更简便。

内容的提问来源于stack exchange,提问作者user19285992

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 15:31:09