使用spring mvc ModelAttribute将元素绑定到列表

时间:2013-02-01 13:14:22

标签: java html forms spring spring-mvc

问题基于getting a spring model attribute list element using an index from javascript,解释了html元素的每个名称都必须包含索引。示例用户[0]

我有一个表单,允许用户在提交之前以恐怖方式添加或删除列表中的元素。让我举一个例子:我们添加3个用户,因此表单现在将包含3个输入:

<input name="user[0].name"    type="text" />
<input name="user[0].surname" type="text" />
<input name="user[1].name"    type="text" />
<input name="user[1].surname" type="text" />
<input name="user[2].name"    type="text" />
<input name="user[2].surname" type="text" />

如果我们提交此信息,我们将有3个用户,每个用户都有姓名和姓氏。但是,当我们尝试删除用户[1]时会出现问题,因为我使用了这个html:

<input name="user[0].name"    type="text" />
<input name="user[0].surname" type="text" />
<input name="user[2].name"    type="text" />
<input name="user[2].surname" type="text" />

如果我们提交此表单,则spring仍会创建3个用户,但用户[1]将具有名称和姓氏的空值。

我知道我可以处理输入名称以始终具有“正确”的形式。但还有另一种解决方案吗?我认为像

这样的形式
<input name="user[].name"    type="text" />
<input name="user[].surname" type="text" />
<input name="user[].name"    type="text" />
<input name="user[].surname" type="text" />

可能会解决问题,但后来我才意识到:春天怎么会知道这个名字带来的姓氏。

有关更好解决方案的想法吗?

1 个答案:

答案 0 :(得分:1)

最后,我添加了没有索引变量的所有输入(现在我在代码中添加了之前丢失的容器):

<div class="container">
    <input name="name"    type="text" />
    <input name="surname" type="text" />
</div>
<div class="container">
    <input name="name"    type="text" />
    <input name="surname" type="text" />
</div>
<div class="container">
    <input name="name"    type="text" />
    <input name="surname" type="text" />
</div>

因此,在提交表单之前,我使用updateIndexedInputNames($(".container"), "user");

让我分享updateIndexedInputNames的代码:

function updateIndexedInputNames($container, name){
    $container.each(function(containerIndex, container){
        $(this).find("input,select").each(function(index, element){
            $(element).attr("name", name+"["+containerIndex+"]."+element.name);
        });
    });
}

我不认为这是一个比@ sp00m建议的更好的解决方案,但它也有效。

希望这有助于某人!