当我使用Spring MVC控制器并通过将值设置为modelAttribute
来提交表单时,我丢失了一些未在表单中映射的模型字段。
在此示例中,因为我没有映射年龄和地址,所以这些用户的字段会丢失,因此它们具有null
值。我不想让用户更改他们的年龄和地址,这就是为什么这些字段不在表单中。
发布用户编辑表单的方法控制器:
@RequestMapping(value = "/edit", method = RequestMethod.POST)
public String editionUser(Model model, @ModelAttribute("accountForm") User user,
BindingResult bresult,
RedirectAttributes redirectAttributes) {
//user.getAge() and user.getAddress are null
//Save the information...
}
获取编辑用户页面的方法控制器:
@RequestMapping(value = "/edit", method = RequestMethod.GET)
public String initEdit(Model model) {
// the user fields are all filled
User user = userService.getUserById(...);
model.addAttribute("accountForm", user);
return "edition";
}
class User {
Long id;
String email;
String age;
String address;
String nickname;
// ...
}
edition.jsp
<form:form class="form" method="POST" action="edition" modelAttribute="accountForm">
<form:label path="email">email</form:label>
<form:input path="email" name='email'/>
<form:label path="nickname">nickname</form:label>
<form:input path="nickname" name='nickname'/>
<form:hidden path="id" />
<input name="submit" type="submit" value="valid" />
</form:form>
不失去这些领域价值的最佳解决方案是什么? (年龄和地址)
为每个字段使用表单隐藏路径?? 在重定向到编辑页面之前将用户存储在会话中,并设置在post方法控制器中检索用户会话以仅更改已修改的字段? 有通用的方法吗?
答案 0 :(得分:7)
我会参加会议的原因很简单:
在提交表单之前隐藏表单字段can be easily manipulated客户端,因此不满足您的要求。
请注意,如果不在某处保存以前输入的值,甚至无法检测到,如果它们在客户端被篡改,那么隐藏字段绝对不是一种选择。
使用会话。
答案 1 :(得分:3)
这是一个老帖子,但也许答案会帮助像我这样的春天新手
不幸的是,除非你使用@SessionAttributes({"attributeName"})
,否则你将丢失对象的其他属性。
这篇文章解释了它Spring MVC - passing variables from one page to anther
答案 2 :(得分:2)
请在此处查看我的回答:
Is it possible to update only a subset of attributes on an entity using Spring MVC with JPA?
这应该适合你。不幸的是,没有更优雅的方法。
另一方面,似乎Spring WebFlow设法仅使用帖子中的字段来更新模型。可能它会将Model存储在会话中,并仅更新POST中包含的值。