我通过AJAX POST提交了一个来自但是我失去了对我的@ModelAttribute值的引用,这会破坏应用程序。这是我的要求(使用Alloy UI,但请求非常一般):
Y.io.request( launches the ajax request
'/userEditForm/' + userID, //request string which calls the controller
{
method: 'GET',
on: {
success: function(e) {
showEditForm();
},
failure: function(e) {
alert(e.error.message);
}
}
});
我有一个请求设置来返回用户表单:
@RequestMapping(value = "/userEditForm/{id}", method = RequestMethod.GET)
public ModelAndView getUserEditForm(@PathVariable Long id){
ModelAndView mav = new ModelAndView("user");//user.html
User user = userRepo.findOne(id);
mav.addObject("user", user);
return mav;
}
此时,我的所有Model属性都填充了值
{user=User [getId()=123, getName()=Bob, getAddress()=54 Little Billy Lane, getPhone()=8457955555, getManager()=Jim Jimson]}
表单仅返回姓名,地址和电话号码字段,因为我不希望用户更新其他用户的ID或管理员
<form action="/saveUser/{id}" method="post">
<input type="text" name="name"><br>
<input type="text" name="address"><br>
<input type="text" name="phone"><br>
</form>
在提交时,我的saveUser @Controller
被称为
@RequestMapping(value = "/saveUser/{id}", method = RequestMethod.POST)
public String saveUser(@ModelAttribute("User") User user, @PathVariable Long id, Model model) {
user = userRepo.findOne(id);
model.addAttribute("user", user);
userRepo.save(user);
return "success";
}
但是在提交时,我的模型只保留在表单上更新的值,并排除其余的
{user=User [getId()=0, getName()=Bob, getAddress()=42 Wallaby Way, getPhone()=7563434444, getManager()=null}
未填充任何预定义字段,这会引发错误,因为提交时用户ID不能为null或0。我正在寻找包括所有字段更新和未更新的表单提交,但我不太确定如何去做。
到目前为止,我已经阅读过Flash和重定向属性,这可能就是我需要的。有什么想法吗?
编辑:正如Neil McGuigan解释的那样,我应该使用@SessionAttributes
。我需要的是可以通过整个会话访问的模型属性,而不仅仅是单个GET或POST。这可以通过会话属性来完成。
答案 0 :(得分:1)
如果您只是部分更新记录,唯一正确和安全的方法是将其置于会话中。使用@SessionAttributes(它位于控制器上方)。
@SessionAttributes("user")
然后,您不需要使用saveUser
方法从数据库中提取用户。
答案 1 :(得分:0)
不知道你最后是不是打字错误,
<form action="/saveUser{id}" method="post">
<input type="text" name="name"><br>
<input type="text" name="address"><br>
<input type="text" name="phone"><br>
</form>
您在/
之后错过了/saveUser
。不应该是/saveUser/{id}
?