2

*编辑:我可能必须使用列表,但同样的原则适用。

我正在尝试使用 @ModelAttribute 注释将数组绑定到表单。用数组的内容填充表(数组中的每个元素对应于表中的一行)。数组可以填充数据,也可以在绑定时为空。用户可以向表中添加行(这应该向数组中添加元素)。

我的问题是,如果在传入之前已经定义了元素,如何将元素添加到数组中?提交表单时会自动发生这种情况吗?

<body>
    <h1>Members</h1>
        <form:form action="configure" modelAttribute="members" method="post" id="member-form">
            <table id="member-table" class="table">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th></th>
                    </tr>
                </thead>
                <tbody id="member-table-body">
                    <c:forEach items="${members}" var="member" varStatus="i" begin="0" >
                        <tr class="member">    
                            <td><form:input path="members[${i.index}].name" id="name${i.index}" /></td>
                            <td><a href="#" class="remove">Remove</a></td>
                        </tr>
                    </c:forEach>
                </tbody>
            </table>
            <input type="submit" value="Save" id="submit" />
            <a href="#" id="add">Add Member</a>
            <a href="?f=">Reset List</a>
        </form:form>   
</body>

__

$(document).ready(function(){
$('#add').click(function(e) {
    e.preventDefault();
    //Add a member

    //Get the number of rows that are in the table
    var memberTable = $('#member-table-body');
    var numRows = memberTable.children('tr').length

    //Add row to the table.
    // memberTable.innerHTML(

    return false;
});
$('.remove').on('click', function(e) {
                e.preventDefault();
                $(this).parent().parent().remove();
                return false;
});

});​</p>

4

2 回答 2

2

您需要创建一个包装列表的模型类并在控制器中使用此模型。

就像是:

package net.viralpatel.spring3.form;

import java.util.List;

public class ContactForm {

    private List<Contact> contacts;

    public List<Contact> getContacts() {
        return contacts;
    }

    public void setContacts(List<Contact> contacts) {
        this.contacts = contacts;
    }
}

然后在 JSP 中使用它作为:

<c:forEach items="${contactForm.contacts}" var="contact" varStatus="status">
    <tr>
        <td align="center">${status.count}</td>
        <td><input name="contacts[${status.index}].firstname" value="${contact.firstname}"/></td>
        <td><input name="contacts[${status.index}].lastname" value="${contact.lastname}"/></td>
        <td><input name="contacts[${status.index}].email" value="${contact.email}"/></td>
        <td><input name="contacts[${status.index}].phone" value="${contact.phone}"/></td>
    </tr>
</c:forEach>

请参阅本教程:Spring MVC:使用 Bean 列表提交多行表单

于 2012-12-14T09:29:13.400 回答
0

这不能由 Spring 自动为您完成。实际上,您在这里没有任何约束力。您正在使用 JSTL EL 迭代数组并将其设置为文本字段。理想情况下,如何处理这个问题是您需要将整个表准备为 json 字符串并提交到后端,在那里解析并了解已添加/删除/更新了多少。您可以有一个隐藏列来维护此状态并在后端进行标识。我不认为数组会在前端自动扩展。这是我的 2 美分。

于 2012-12-14T01:34:13.030 回答