6

我有一个 Spring MVC 应用程序,我想知道如何成功地将 JSP 页面中具有相同名称的多个动态表单元素映射到我的对象类。例如:

在我的 locations.jsp 页面中,我有多个下拉框:

<form id="tabs-3-form">
    <input id="locations-1" name="location" />
    <input id="locations-2" name="location" />
    <input id="locations-3" name="location" />
    ... (more can be added or deleted dynamically by user)
</form>

我正在使用 jQuery 将表单发布到我的控制器:

$("#tabs-3-form").submit(function() {
    $.ajax({
        type: 'POST',
        url: '/searchResults',
        data: $(this).serialize(),
        dataType: 'json',
        success: function(data) {
           ...
        }
    });
    return false;
});

我的 LocationsController.java 设置如下:

@RequestMapping(value = "/locationResults", method = RequestMethod.POST)
public @ResponseBody LocationsCollection locationsCollection
(
    @ModelAttribute(value = "location") Location location,
    BindingResult result
) 
{   
    LocationsCollection locationsCollection = new LocationsCollection();
    locationsCollection.addLocation(location);

    // Anything else to do here?

    return locationsCollection;
}

LocationsCollection.java只包含一个Location对象列表。

我需要在输入字段的名称中添加括号吗?MVC 会像其他表单元素一样自动映射到列表吗?如果有人能提供一个例子,我将不胜感激。

4

2 回答 2

3

我可以通过以下示例使其工作: http://lifeinide.blogspot.com/2010/12/dynamic-forms-lazylist-and-transparent.html?showComment= 1355160197390#c6923871316812590644

不过,我确实做了一次调整。对于表单名称,我使用:

<input name="locationList[0].locationName" />

而不是文章建议的内容:

<input name="myFormObject.elements[0].property" />
于 2012-12-10T19:11:17.733 回答
-1

如果您对表单元素使用相同的名称,我认为您需要使用方括号。

<c:forEach items="${expenseForm.expenseDetails}" varStatus="i">
  <tr id="expenseDetail_${i.index}" class="lineItemsClass" lineNum="${i.index}">
    <td><form:input path="expenseDetails[${i.index}].description" cssStyle="width: 200px;" /> <label style="color: red;"><form:errors path="expenseDetails[${i.index}].description" /></label></td>
    <td><form:input path="expenseDetails[${i.index}].quantity" cssStyle="width: 60px;" readonly="true"/> <label style="color: red;"><form:errors path="expenseDetails[${i.index}].quantity" /></label></td>
    <td><form:input path="expenseDetails[${i.index}].unitPrice" cssStyle="width: 60px;" readonly="true"/> <label style="color: red;"><form:errors path="expenseDetails[${i.index}].unitPrice" /></label></td>
    <td><form:input path="expenseDetails[${i.index}].total" cssStyle="width: 60px;" /> <label style="color: red;"><form:errors path="expenseDetails[${i.index}].total" /></label></td>
  </tr>
</c:forEach>

这里的expenseDetails 是modelAttribute 类中的列表。路径名称将用作 html 表单名称,并将基于索引。上面的代码段对我来说工作正常。

于 2012-12-08T17:12:09.510 回答