Spring 3 MVC表单与java.util.List绑定,包括表单错误和bindingResult验证



我很难找到关于List对象的Spring表单(包括验证)的好信息,尤其是当与选择框或复选框等无关时。

我想要一个表单对象,如:

public class MyForm {
    private List<String> values;
    public List<String> getValues() { return this.values; }
    public void setValues(List<String> values) { this.values = values; }
}

JSP:

<form:form method="post" action="${pageContext.request.contextPath}/something" commandName="myForm">
    ...
    <c:forEach var="unused" items="${myForm.values}">
        <div><form:input path="values" /><form:errors path="values" /></div>
    </c:forEach>
    ...
</form:form>

控制器:

...
for (String value : myForm.getValues()) {
    if (! isValidCode(value)) {
        bindingResult.rejectValue("values", "invalid.code", "Code unknown!");
    }
}
...

当我提交表单时,我可以看到在java.util.List中输入的值是正确的。

当表单再次呈现时:a) 每个输入字段都具有相同的值(最后输入的值),并且b) 表单:errors为每个字段显示多条错误消息,包括有效值。

我在列表上的c:forEach循环导致每个输入字段获得相同的值,这有什么问题吗?

有可能做这样的事情吗:

    if (! isValidCode(value)) {
        bindingResult.rejectValue("values[" + i + "], "invalid.code", "Code unknown!");
    }

和:

<c:forEach var="unused" items="${values}" varStatus="status">
    <div><form:input path="values" /><form:errors path="values[${status.index}]"  /></div>
</c:forEach>

这特别不起作用,我已经尝试了很多变体,但似乎都无法实现——任何想法/帮助都将不胜感激!

谢谢。

两个表单标签都应该有相同的路径:

<c:forEach items="${values}" varStatus="status">
    <div><form:input path="values[${status.index}]" /><form:errors path="values[${status.index}]"  /></div>
</c:forEach>

最新更新