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

时间:2013-03-20 11:26:21

标签: forms spring spring-mvc binding modelattribute

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

摘要:我有一个表格,其中包含从DB加载并在弹簧模型中支持的大量用户。我希望每个用户都有一个编辑按钮,我想调出另一个表单来编辑该用户,并且仍然让该用户在模型中备份,这样我就不必透露id或将用户映射到随机密钥

我有一个List<User>对象,我通过@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);
}

这将返回视图users.jsp,并使用表单

在表格中显示用户列表
<form:form action="#" method="post" modelAttribute="userset">
    <table>
        <tr>
            <th>N.</th>
            <th>Name</th>
            <th>Email</th>
        </tr>
        <c:forEach var="user" items="${userset.userList}"
            varStatus="status">
            <tr>
                <td align="center">${status.count}</td>
                <td><input name="userList[${status.index}].name"
                    value="${user.name}" id="name_${status.index}" /></td>
                <td><input name="userList[${status.index}].email"
                    value="${user.email}" id="email_${status.index}" /></td>
                <td><input type="button" value="Ed." id="edbtn${status.index}"
                    class="edbtn" /></td>
            </tr>
        </c:forEach>
    </table>
    <input type="submit" value="Save" />
</form:form>

现在,您可以看到每个用户都有一个编辑按钮<input type="button" value="Ed." id="edbtn${status.index}" class="edbtn" />。我想要做的是当我点击该按钮时出现一个新的单用户表单,并将我的User对象绑定到它,这样如果我更改名称和电子邮件,我仍然可以获取该ID服务器端,以便在数据库中更新它。上面的多用户表单应禁用所有字段或显示为标签 - 我不想在那里更改内容;我只是想在那里展示它们并按下按钮来打开弹出窗口或浮动div,其中包含实际的单用户窗体。

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

@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我还会弹出这个单用户表单并将其放在屏幕中间的所有内容之前。

如何实现这一目标?

P.S。:这可能不是编辑功能的最佳方法。在这种情况下,我真的很感激你提供了一些提示。

由于

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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