<form:form method="post" action="/changeEnabledResource" modelAttribute="user">
<c:forEach items="${user.resources}" var="resource">
<form:radiobutton path="resources"
value="${resource}"
label="${resource.name}"
checked="${resource.enabled ? 'checked' : ''}/>
</c:forEach>
<input type="submit" value="Submit"/>
</form>
资源类:
public class Resource {
private Long id;
private String name;
private boolean enabled;
//getters setters
}
用户类:
public class User {
private List<Resource> resources;
....
//rest of code
}
使用上面的代码所有形式:radiobuttons已检查=&#34;已检查&#34;,因此在表单加载时始终检查最后一个。提交工作正常,它将正确的一个更改为启用,其余部分未启用(服务类处理此操作)。但是当页面加载所有单选按钮时都检查了=&#34;已检查&#34;。
为什么会发生这种情况,或者这样做的正确方法是什么,以便IS启用的资源检查单选按钮?
答案 0 :(得分:0)
答案是不要使用表格:radiobutton(s)标签,因为它们显然不能很好地工作。我还没有找到任何使用此标记的好示例。我的解决方案只是使用纯HTML输入标签,并在控制器方法中使用@RequestParam,它只传递检查的单选按钮的值。我可以轻松使用$ {resource.enabled? &#39;检查&#39; :&#39;&#39;}以确保选择正确的。
答案 1 :(得分:0)
在单独的属性中设置所选值:
public class User {
private int selectedResourceId;
private List<Resource> resources;
....
//rest of code
}
...
<form:radiobutton path="selectedResourceId"
value="${resource.id}"
label="${resource.name}"/>
...
在页面加载时,初始化selectedResourceId
(基于resource
enabled
标记为true
),以便form:radiobutton
标记知道哪一个在呈现页面时选择。
提交表单后,转到另一个方向,根据resource.enabled
设置相应的selectedResourceId
标记。