Spring 处理同一类型的多个表单-不可能?
考虑以下场景:Spring 处理同一类型的多个表单-不可能?,spring,spring-mvc,Spring,Spring Mvc,考虑以下场景: 我的表单模型 public class PersonForm { @NotNull private String name; /*usual getters and setters*/ } 我的控制器: @Controller @SessionAttribute(types={ PersonForm.class }) public class MyController { @RequestAttribute(...) public
public class PersonForm {
@NotNull
private String name;
/*usual getters and setters*/
}
@Controller
@SessionAttribute(types={ PersonForm.class })
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
}
}
}
...
<c:forEach ...>
<form:form commandName="p${counter}">
... other form:elements and submit button goes here
</form:form>
</c:forEach>
...
。。。
... 其他表单:元素和提交按钮位于此处
...
非常感谢。我认为,拥有多种形式会使事情变得过于复杂(或者至少使用spring)。此外,您正在使用多个表单,但只将提交一个表单 因此,我建议最简单的管理方法是使用具有person属性的唯一隐藏外部表单。当按下其中一个按钮时,相应地填写表单的person属性并提交。有了它,您就可以实现典型的spring表单提交/验证
也许这个解决方案需要一点JavaScript,但我不知道如何使用多个表单处理spring mvc,我一直试图避免它,因为以前的尝试不成功。我设法让这个“黑客”工作起来。这正是杰利斯所推荐的,因此功劳全归他了 简单地说,概念是使用传统的
构造预填充视图。棘手的是,每当按下相应行的“提交”按钮时,所有信息都必须被注入到一个隐藏的表单中,并强制提交给控制器。如果屏幕再次呈现时出现一些错误,则脚本必须负责将值注入回相应的行(包括错误)
1) 我的模型 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) 我的看法
。。。
...
...
injectValuesAndForceSubmit=函数(id){
$('#id').val(id);//填写隐藏表单的id
$('#name').val($('#'+id+'name').val());//填写隐藏表单的名称
$('#personForm').submit();//提交!
}
$(文档).ready(函数(){
var id=$('#id').val();
如果(id.trim().length==0){
//空。此处无需执行任何操作,因为这是一个简单的渲染。
}否则{
//页面似乎从某种错误中返回…预填充相应的行!
$('#'+id+'name').val($('#name').val());
var hiddennemerorspan=$('#name.errors');
如果(hiddenNameErrorSpan){
$('#'+id+'nameErrorSpan').text(hiddenNameErrorSpan.html());
}
}//否则
}
正如您所看到的,该视图具有最令人毛骨悚然的部分——希望它仍能被证明对(不幸的)以下人员有用遇到了与我相同的情况。干杯!表单:表单标签的
路径属性的目的是什么?我想这个spring标签中没有定义:。我的道歉——我是指commandName。原始线程已编辑。非常感谢您的回复!恐怕我在分配表单时仍然会有问题:错误。您是欢迎:)好吧,如果你只有一个表单,你就会知道错误在哪里。。。但再一次,需要一些额外的JS才能将它们移动到正确的位置。实际上我还没有想到。。。我可以用一些JS提取错误消息。这比使用AJAX要干净得多。谢谢是的,我提交了一份简明扼要的版本,我必须解释我是如何把它连接起来的。谢谢
@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
}
}
}
...
<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>