Forms Spring MVC编辑对象时如何处理绑定

Forms Spring MVC编辑对象时如何处理绑定,forms,spring,spring-mvc,binding,modelattribute,Forms,Spring,Spring Mvc,Binding,Modelattribute,我是SpringMVC的新手——到目前为止,我已经看过很多教程,但刚刚开始开发。我刚刚遇到了这个问题: 摘要:我有一个表单,其中有一个表,其中包含从DB加载的大量用户,并在spring模型中进行了备份。我希望每个用户都有一个编辑按钮,我希望打开另一个表单来编辑该用户,并且仍然将该用户备份到模型中,这样我就不必透露id或将用户映射到随机键。 我有一个List对象,我通过@Service bean从数据库中检索它,然后我将这个列表传递给我的UserControllerbean。然后,在我的控制器中:

我是SpringMVC的新手——到目前为止,我已经看过很多教程,但刚刚开始开发。我刚刚遇到了这个问题:

摘要:我有一个表单,其中有一个表,其中包含从DB加载的大量用户,并在spring模型中进行了备份。我希望每个用户都有一个编辑按钮,我希望打开另一个表单来编辑该用户,并且仍然将该用户备份到模型中,这样我就不必透露id或将用户映射到随机键。

我有一个
List
对象,我通过@Service bean从数据库中检索它,然后我将这个列表传递给我的
UserController
bean。然后,在我的控制器中:

@RequestMapping(value="/users", method = RequestMethod.GET)
public ModelAndView showUsers() {       
    List<User> users = userService.getUserList(); //Get from DB. Returns some users.
    UserSet uset = new UserSet(); //Custom object backing the list.
    uset.setUserList(users);

    return new ModelAndView("users", "userset", uset);
}
@RequestMapping(value="users/edit", method = RequestMethod.POST)
public String edit(@ModelAttribute(value="user") User user, BindingResult bresult) {
    /* Do something here with the user */
    /* Currently the ID returned from user.getId() is null, but the original user shown in the form has an ID != null */
    return "redirect:/users";
}
现在,您可以看到每个用户都有一个编辑按钮
。我想做的是,当我点击该按钮时,会出现一个新的单用户表单,并将我的用户对象绑定到它,这样,如果我更改了名称和电子邮件,我仍然可以在服务器端获取ID,以便在数据库中更新它。上面的多用户表单应该禁用所有字段或显示为标签-我不想在那里更改内容;我只想在那里显示它们,并用按钮打开一个弹出窗口或浮动div,其中包含实际的单用户表单

顺便说一句,我正在尝试使用以下控制器捕获已编辑的用户:

@RequestMapping(value="/users", method = RequestMethod.GET)
public ModelAndView showUsers() {       
    List<User> users = userService.getUserList(); //Get from DB. Returns some users.
    UserSet uset = new UserSet(); //Custom object backing the list.
    uset.setUserList(users);

    return new ModelAndView("users", "userset", uset);
}
@RequestMapping(value="users/edit", method = RequestMethod.POST)
public String edit(@ModelAttribute(value="user") User user, BindingResult bresult) {
    /* Do something here with the user */
    /* Currently the ID returned from user.getId() is null, but the original user shown in the form has an ID != null */
    return "redirect:/users";
}
我通过jQuery发送编辑请求:

jq("#edituserbtn").click(function() {
        jq.post("users/edit", {
            name : jq("#edfrm_n").val(),
            email : jq("#edfrm_e").val(),
        }, function(data, status) {
            //jq("#changing").text(data + "; " + status);
        });
    });
请注意,
#edfrm_n
#edfrm_e
将是我要在此处使用的单用户表单的id,而不是发回整个表单。使用jQuery,我也会弹出这个单用户表单,并把它放在屏幕前面的所有东西前面。

如何做到这一点

注意:这可能不是编辑功能的最佳方法。在这种情况下,我非常感谢你给我一些提示


谢谢

我想你应该对现有的代码做些修改。您应该将用户id设置为用户编辑按钮值,您可以编写一个js函数,参数为用户id、用户名和状态。把它绑在钮扣上。当您单击编辑按钮时,它将运行js函数,并在此对话框中弹出一个新对话框,您可以获取三个参数并显示它们。我建议您使用jQuery对话框,因为您已经添加了jQuery库。您应该在这个对话框中添加save按钮,在编辑用户数据之后,只需单击save按钮并调用ajax将数据发送到服务器,因为它有id,所以您知道将更新哪个。服务器将返回更新操作的状态,在ajax回调函数中,使用状态执行其他操作。如果成功,关闭对话框并刷新主窗口,如果失败,则弹出警报对话框。

我认为您应该对现有代码进行一些更改。您应该将用户id设置为用户编辑按钮值,您可以编写一个js函数,参数为用户id、用户名和状态。把它绑在钮扣上。当您单击编辑按钮时,它将运行js函数,并在此对话框中弹出一个新对话框,您可以获取三个参数并显示它们。我建议您使用jQuery对话框,因为您已经添加了jQuery库。您应该在这个对话框中添加save按钮,在编辑用户数据之后,只需单击save按钮并调用ajax将数据发送到服务器,因为它有id,所以您知道将更新哪个。服务器将返回更新操作的状态,在ajax回调函数中,使用状态执行其他操作。如果成功,关闭对话框并刷新主窗口,如果失败,则弹出警报对话框。

好吧,我认为Spring正在发挥一些魔力,但我现在认为它没有发挥作用。正如zeroflagl所说,Spring需要知道您正在尝试更新什么,因此必须提供某种类型的ID或实际的DB ID。

好吧,我认为Spring正在发挥一些魔力,但现在我认为它没有发挥作用。正如zeroflagl所说,Spring需要知道您试图更新的内容,因此必须提供某种ID或实际的DB ID。

谢谢您的评论。这正是我不想做的,尽管。。。Spring提供了一种绑定数据的方法,而无需将DB id散布到任何地方(不管是否隐藏,它们无论如何都会被发布),因此我不想采用这种方法。的确,发布id会让事情变得更容易——只需捕获该id并转到数据库即可。但我说的是支持对象,它“神奇地”绑定到视图的表单和其他数据。无论如何,我很感激你的回答:)我知道你说的是因为你使用了spring标签,但根据我的经验,由于你使用ajax,这不是一个好方法。谢谢你的评论。这正是我不想做的,尽管。。。Spring提供了一种绑定数据的方法,而无需将DB id散布到任何地方(不管是否隐藏,它们无论如何都会被发布),因此我不想采用这种方法。的确,发布id会让事情变得更容易——只需捕获该id并转到数据库即可。但我说的是支持对象,它“神奇地”绑定到视图的表单和其他数据。无论如何,我很感激你的回答:)我知道你说的是因为你使用了spring标签,但根据我的经验,既然你使用ajax,那就不是一个好方法。如果你不告诉spring,它怎么知道你在编辑什么用户?您必须至少发送一些信息。如果您不告诉Spring,它如何知道您正在编辑的用户?你必须至少发送一些信息。