我设法让这个'黑客'工作。正如 jelies所建议的那样,信誉归功于他。
简而言之,其概念是使用传统的<c:forEach>
构造预填充您的视图。棘手的部分是每当按下相应行的“提交”按钮时,所有信息都必须注入隐藏表单并强制提交给控制器。如果屏幕再次出现一些错误,则该脚本必须负责将值注回到相应的行,包括的错误。
1)我的模型
public class PersonForm {
private String id;
@NotNull
private String name;
/*usual getters and setters*/
}
2)我的控制器
@Controller
@SessionAttribute(/* the hidden form name, the person list */)
public class MyController {
@RequestAttribute(...)
public String render(final ModelMap map) {
/* get list of info and for each info
* create a PersonForm and put it in the modelmap
* under key p0, p1, p2, ..., pn
*/
}
public String submit(final ModelMap map,
@Valid final PersonForm form,
final BindingResult result) {
if (result.hasErrors()) {
// return to page
} else {
// do necessary logic and proceed to next page
}
}
}
3)我的观点
...
<form:form commandName="personForm" cssStyle="display: none;">
<form:hidden path="id"/>
<form:hidden path="name" />
<form:errors path="name" cssStyle="display: none;" />
</form:form>
...
<c:forEach var="p" items="${pList}">
<input type="text" id="${ p.id }Name" value="${ p.name }" />
<!-- to be filled in IF the hidden form returns an error for 'name' -->
<span id="${ p.id }nameErrorSpan"></span>
<button type="button" value="Submit" onclick="injectValuesAndForceSubmit('${ p.id }');" />
</c:forEach>
...
<script type="text/javascript">
injectValuesAndForceSubmit = function(id) {
$('#id').val(id); // fill in the hidden form's id
$('#name').val($('#'+id+'name').val()); //fill in the hidden form's name
$('#personForm').submit(); //submit!
}
$(document).ready(function() {
var id = $('#id').val();
if (id.trim().length == 0) {
//Empty. Nothing to do here as this is a simple render.
} else {
//The page seems to be returning from some sort of error ... pre-fill the respective row!
$('#'+id+'name').val($('#name').val());
var hiddenNameErrorSpan = $('#name.errors');
if (hiddenNameErrorSpan) {
$('#'+id+'nameErrorSpan').text(hiddenNameErrorSpan.html());
}
} //else
}
</script>
正如你可发即观点有最毛茸茸的部分 - 希望它仍然证明对于(不幸)遇到与我一样的情况的任何人都是有用的。干杯!
“form:form'标签的'path'属性的用途是什么?我认为在这个春天的标签中没有定义:[spring-form definition](http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/spring-form.tld.html #弹簧form.tld.form)。 – jelies 2012-08-08 10:10:27
我的歉意 - 我的意思是commandName。原始线程已被编辑。 – 2012-08-08 11:00:47