【问题标题】:Spring binding collection to form with hidden fieldSpring绑定集合以形成隐藏字段
【发布时间】:2012-01-16 03:36:59
【问题描述】:

我正在尝试编辑产品。表单支持对象非常简单:

private Integer           productId;
private String            name;
private Double            price;
private List<Integer>     relatedProductList;  //list of related product ids

...//getters/setter

导致问题的部分是relatedProductList。我正在尝试将列表放在帖子上以将其显示在子页面上。我尝试在我的 jsp 中使用这样的隐藏字段:

<form:hidden path="relatedProductList"/>

隐藏字段在 html 中的显示效果如您所愿:

<input id="relatedProductList" name="relatedProductList" type="hidden" value="[200408, 200417]"/>

使用 firebug 的帖子数据看起来不错:

relatedProductList    [200408, 200417]

但在我的控制器中,表单支持对象有一个空产品列表??

@RequestMapping(method = RequestMethod.POST, value = "/edit.do", params = "editRelatedProducts")
public ModelAndView editRelatedProducts(@Valid @ModelAttribute ProductForm form, BindingResult result) {
    if (result.hasErrors()) {    
        ModelAndView view = new ModelAndView(VIEW_PRODUCT);
        setupCreateReferenceData(view , form);
        return view ;
    }

    ModelAndView editView = new ModelAndView(VIEW_EDIT_RELATED);

    //method to lookup the product ids and place product objects on model
    editView.addObject("relatedProducts",populateProductList(form.getRelatedProductList()));

    return editView ;
}

** 但是 form.getRelatedProductList 为空!

我可以通过在显示相关产品的循环中使用隐藏字段并在 jsp 中设置值来解决此问题:

        <div>
            <table id="relProductTbl" class="tablesorter">
              <thead>
                 ...
              </thead>
              <tbody>
                  <c:forEach var="prod" items="${relatedProducts}" varStatus="row">
                        <tr>
                            <input id="relatedProductList" name="relatedProductList" type="hidden" value="${prod.productId}"/>
                             ...
                        </tr>
                  </c:forEach>
              </tbody>
            </table>
        </div>

这会产生以下 html:

<input id="relatedProductList" name="relatedProductList" type="hidden" value="200408"/>
...
<input id="relatedProductList" name="relatedProductList" type="hidden" value="200417"/>

这看起来不错并产生以下帖子:

relatedProductList    200408
relatedProductList    200417

突然,form.getRelatedProductList() 现在被正确填充了。

有谁知道为什么 post data contractList [200408, 200417] 在使用 springs form:hidden 标签时没有正确绑定到表单?这是一个错误还是预期的行为。对我来说似乎很奇怪只是想把它扔在那里,看看我是否做错了,或者它是否可以帮助其他人。

谢谢。

【问题讨论】:

标签: spring-mvc hidden-field


【解决方案1】:

我知道这是旧的,但让我简要回答一下:

您在生成的 HTML &lt;input id="relatedProductList" name="relatedProductList" type="hidden" value="[200408, 200417]"/&gt; 中观察到的 relatedProductList [200408, 200417] 只是 relatedProductList.toString() 的值,而后者又使用来自 java.util.AbstractCollection 的默认实现。格式是这样的:[..., ..., ...]。 Spring MVC 使用 toString() 方法来获取表单输入字段的表示,这非常简单:它需要一个纯字符串。

这并不能保证它以后能够解析相同的字符串。显然,如果不能,它只是将变量绑定到null。

您后来所做的(直接使用 &lt;input type="hidden"&gt;)实际上更像是一种 hack,但我习惯了在使用 Spring MVC 时有时不得不做这些事情,因为在功能上存在一些差距。

一般来说,如果有多个同名的表单字段,它们都会嵌入到 POST 数据中。如果您检查 POST 数据字符串,您会在那里找到类似 relatedProductList=200408&amp;relatedProductList=200417 的内容。现在,当 Spring MVC 在解析 POST 数据时发现这种情况时,它会尝试将其映射到手头的目标变量。如果该目标变量是 java.util.Collection (如您的情况),它将使用 POST 数据中的值作为集合元素,这非常直观。

如果,再举一个例子,目标变量的类型是String,它将像这样填充它:"200408,200417"

【讨论】:

    猜你喜欢
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多