返回页面时如何保留单选框选中状态?Thymeleaf代码排查
问题
我有两个视图:视图1是带单选框的游戏选择页面,视图2根据选中的单选框展示对应游戏的数据。从视图2返回视图1时,想让之前选中的单选框保持选中状态。我尝试通过URL参数param.gameId实现(比如访问http://localhost:8080/reservations/chooseGame?gameId=1),但单选框始终没被选中。以下是视图1的Thymeleaf代码:
<main class="general"> <h2>Games</h2> <form action="/reservations/chooseGame" method="post"> <div class="container"> <p th:if="${games.empty}" >No Games Available.</p> <p th:each="game : ${games}"> <input id="gameId" type="radio" name="gameId" th:value="${game.id}" th:checked="${game.id == gameId or param.gameId == game.id}" th:disabled="${checkButton == null}" th:hidden="${checkButton == null}" required/> <label for="gameId" class="label-rad"> <span th:text="${game.name}"></span> </label> </p> </div> <button type="submit" th:hidden="${checkButton == null}">Submit</button> <a th:href="@{/reservations/1}" th:hidden="${checkButton == null}" class="button-back">Go Back</a> </form> </main>
疑问:URL参数明明存在,为什么单选框还是没被选中?
解决思路与修复方案
核心问题:类型不匹配
param.gameId从URL获取的是字符串类型,而game.id通常是数值类型(比如Long或Integer),直接用==比较会因为类型不一致返回false,导致选中判断失效。修复选中判断逻辑
把参数转成和game.id匹配的类型再比较,有两种常用方式:- 把
game.id转成字符串和参数比较:th:checked="${game.id == gameId or #strings.equals(param.gameId, #strings.toString(game.id))}" - 把参数转成数值类型和
game.id比较:
(如果th:checked="${game.id == gameId or game.id == #numbers.toLong(param.gameId)}"game.id是Integer类型,就用#numbers.toInteger(param.gameId))
- 把
额外修复:重复的id属性
当前代码里所有单选框的id="gameId"是重复的,会导致label和单选框的关联出错,改成动态生成唯一id:<input th:id="'gameId-' + ${game.id}" type="radio" name="gameId" th:value="${game.id}" ... /> <label th:for="'gameId-' + ${game.id}" class="label-rad"> <span th:text="${game.name}"></span> </label>
内容的提问来源于stack exchange,提问作者alrightalrightalright
相关产品推荐
相关产品推荐

