我在视图中列出了表格中的对象。我希望能够使用表格中的按钮编辑对象。
<#list products as product>
<tr>
<td>${product.productName}</td>
<td>${product.price}</td>
<td>${product.quantity}</td>
<td>
<form name="product" method="post" action="/product/edit">
<input type="submit" name="submit" value="Edit this product"/>
</form>
</td>
</tr>
</#list>
然后应该将对象传递给控制器方法:
@RequestMapping(value="/edit", method = RequestMethod.POST)
public ModelAndView edit(@ModelAttribute("product") Product product){
ModelAndView mav = new ModelAndView("product/edit");
mav.addObject("product", product);
return mav;
}
但是,product
方法获得的edit
为空。我该如何解决?我尝试使用下面的代码在表单中绑定产品,但这也不起作用。
<form name="product" method="post" action="/product/edit">
<@spring.bind "product" />
<input type="hidden" name="${spring.status.expression}" value="${spring.status.value}"/>
<input type="submit" name="submit" value="Edit this product"/>
</form>
我想使用POST方法。
答案 0 :(得分:1)
我想建议一种不同的方法。如果我没有弄错,你只想选择一个对象供以后编辑 - 你不会在那个视图中真正编辑它。
如果是这样,您所要做的就是将对象的标识符传递给控制器,而不是将所选对象本身传递给它。
如果没有,你应该给我们一个洞的故事,并提供其余的观点。
假设我是对的,下一个问题就是为什么你需要使用表单提交。传递id最好通过链接来完成 - 作为参数,或者,如果你遵循REST风格,作为URI本身的一部分:
<!-- Link parameter -->
<#list products as product>
<tr>
<td>${product.productName}</td>
<td>${product.price}</td>
<td>${product.quantity}</td>
<td>
<a href="yourURI?pid=${product.productName}">Edit ${product.productName}</a>
</td>
</tr>
</#list>
<!-- REST-style -->
...
<a href="product/{product.productName}/edit">Edit ${product.productName}</a>
...
productName
当然不是一个好的身份。如果products
是一个列表(意思是java.util.List
),则列表的索引很方便。即使在HashMap
或Set
中,我也会创建一个唯一ID,而不是使用产品名称。
现在您可以识别您的对象,在支持代码中选择它以供以后编辑,但不在视图中。 您将找到大量如何在控制器中获取链接参数的示例。所以,这里不需要详细说明。
但是,如果你坚持使用表单和POST方法,那么就这样做:
<form method="post" action="/product/edit">
<#list products as product>
<tr>
<td>${product.productName}</td>
<td>${product.price}</td>
<td>${product.quantity}</td>
<td>
<button value="${product.productName}" name="product" type="submit">Edit ${product.productName}</button>
</td>
</tr>
</#list>
</form>
请注意,这不适用于较旧的IE浏览器(低于Ver.10),因为它们不会返回值,而是返回按钮标记内的所有内容。
隐藏的输入和单个提交按钮根本无济于事,因为所有输入都已提交,并且使用不同的表单也不是。