【发布时间】:2015-08-06 09:06:10
【问题描述】:
这是一个添加页面。人员包含地址列表,因此当我尝试向该人员添加尚未在数据库中的地址时,我需要能够在提交地址时检索人员表单并将该地址分配给该人员。
<form:form action="${addAction}" modelAttribute="person">
<form:label path="name">
<spring:message text="Name"/>
</form:label>
<form:input path="name" />
... More labels and inputs
</form:form>
<form:form action="${addAddress}" modelAttribute="address">
... Labels
<input type="submit" value="<spring:message text="Add Address"/>" />
</form:form>
在我的控制器中,我有 "@ModelAttribute("person") Person p" 行,它应该检索其中包含 "modelAttribute="person"" 的表单。但是检索到的人是一个空实体,我假设这是因为必须提交人员表单才能检索数据。
@RequestMapping(value = "/person/addAddress", method = RequestMethod.POST)
public String addAddress(@ModelAttribute("person") Person p, @ModelAttribute("address") Address a, RedirectAttributes redirectAttrs) {
p.getAddresses().add(a);
redirectAttrs.addFlashAttribute("person", p);
return "redirect:/person";
}
我可能可以检索输入而不是表单并使用它们来创建具有这些值的新实体,但如果我这样做,控制器的传递属性将充满输入并且看起来很难看。有没有办法让我将这些值作为 Person 实体检索?
编辑
Sanjay 的第一个选择是最合乎逻辑的方式,但由于我想要设计的内容不适合它,所以我无法做到。但是桑杰关于以一种形式制作的评论帮助了我,所以我选择桑杰的答案作为解决方案,但这是我修复它的方法 由于我在 c:url 中保存了表单操作,因此我更改了按钮的 onclick 功能,这样当单击表单时,操作会根据按钮而改变,并且我已经有相应的操作控制器。对于我个人内部的地址列表,我必须首先在我的页面控制器中的列表中添加一个空地址,然后使用
<c:forEach items="${person.addresses}" varStatus="loop">
<c:if test="${loop.last}">
<form:input path="addresses[${loop.index}].street" />
...
我上面的代码能够填充之前添加的空地址。 我仍在修复所有问题,但这是我如何修复它的总体思路。感谢您的帮助。
【问题讨论】:
-
我认为提交form2时无法获取form1的数据。你需要改变你的场景,例如把所有东西都放在一个大表格中。
-
谢谢 Sanjay,但我认为这行不通,因为我不知道它是添加地址还是添加人员,如果它是一种形式。在添加人员之前,我需要能够向该人员添加多个地址
-
你应该只使用一种形式。
标签: spring forms jsp spring-mvc controller