【问题标题】:AJAX POST Loses Reference to Model Attributes - SpringAJAX POST 失去对模型属性的引用 - Spring
【发布时间】:2015-09-09 21:09:07
【问题描述】:

我正在通过 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; 
}

此时我的所有模型属性都填充了值,

{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 不能为空或 0。我正在寻找在我的表单提交时包含所有更新和未更新的字段,但我不太确定如何去做。

到目前为止,我已经阅读了可能是我需要的 Flash 和重定向属性。有什么想法吗?

编辑:正如 Neil McGuigan 解释的那样,我应该使用 @SessionAttributes。我需要的是可以在整个会话中保持访问的模型属性,而不仅仅是单个 GET 或 POST。这可以通过会话属性来完成。

【问题讨论】:

  • &lt;form action="/saveUser{id}" method="post"&gt; &lt;input type="text" name="name"&gt;&lt;br&gt; &lt;input type="text" name="address"&gt;&lt;br&gt; &lt;input type="text" name="phone"&gt;&lt;br&gt; &lt;/form&gt;/saveUser 之后是否缺少/。应该是/saveUser/{id} 吗?
  • 只是一个错字,我的斜线在那里,但谢谢

标签: javascript ajax forms spring-mvc


【解决方案1】:

如果您只是部分更新记录,唯一正确且安全的方法是将其置于会话中。使用@SessionAttributes(它就在您的控制器上方)。

@SessionAttributes("user")

然后,您无需在 saveUser 方法中从数据库中获取用户。

【讨论】:

  • @SessionAttributes 正是我要找的,谢谢
【解决方案2】:

不知道是不是你这里打错了,

<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}吗?

【讨论】:

  • 只是一个错字,我的控制器用 /saveUser/{id} 调用很好,但你是对的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-01
  • 2019-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
相关资源
最近更新 更多