针对复选框的模型绑定似乎不适用于技能列表。我知道javascript是一个选项,但是,现在我坚持使用jsp / jstl路由。
// PersonViewModel.java
public class PersonViewModel {
private String fullName;
private Integer experienceInYears
private List<SkillItemViewModel> skillList;
/* getters and setters */
}
// SkillItemViewModel.java
public class SkillItemViewModel {
private Long skillId;
private String skillName;
private Boolean skillSelected;
/* getters and setters */
}
// controller GET Action
@RequestMapping("person/edit")
public ModelAndView editPerson (HttpServletRequest request, HttpServletResponse response) {
/* set the view model from the model and attach it to the Model and View object */
}
// controller POST Action
@RequestMapping("person/update")
public ModelAndView updatePerson(HttpServletRequest request, @ModelAttribute("personViewModel") PersonViewModel viewModel, BindingResult result){
/*
on debugging viewModel.skillList is null
*/
}
// Edit Person jsp code snippet editProfile.jsp
<c:set var="loopVar" value ="0">
<ul>
<c:forEach var="item" items="${personViewModel.skillList}">
<spring:bind path="personViewModel.skillList[${loopVar}].skillSelected">
<input type="checkbox" name="chkSkill${item.skillId}" ${item.skillSelected?'checked':''}>
<label for="chkSkill${item.skillId}">${item.skillName}</label>
</spring:bind>
</c:forEach>
</ul>
<c:set var="loopVar" value ="${loopVar + 1}">
答案 0 :(得分:0)
听起来像是一个有约束力的问题。您是否尝试过使用Spring的<form:checkbox>
代码而不是<spring:bind>
?它将自动生成复选框属性以及Spring用于确定复选框是“开启”还是“关闭”的隐藏字段。
此外,您应该使用varStatus
循环变量来跟踪索引。
<强> editProfile.jsp 强>
<ul>
<c:forEach var="item" items="${personViewModel.skillList}" varStatus="status">
<form:checkbox path="skillList[${status.index}].skillSelected" id="chkSkill${item.skillId}"/>
<label for="chkSkill${item.skillId}">${item.skillName}</label>
</c:forEach>
</ul>