AJAX POST失去对模型属性的引用 - Spring

时间:2015-06-23 21:00:36

标签: javascript ajax forms spring-mvc

我通过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。这可以通过会话属性来完成。

2 个答案:

答案 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}