在Play中处理字段集! 框架2.3(Java)

我想弄清楚怎么玩! 处理使用多个具有相同名称的字段的表单。

例如,看一下这个表单片段:

Select product... @for(product<-Product.findAll()) { @product.name } Member price Public price
Add line...

我使用括号表示法,因为用户可以通过单击“添加行…”按钮添加任意数量的订单行。 单击按钮时,JavaScript函数克隆

并将其附加到下方。 基本上,提交的表单包含多个订单行。

现在我想要做的是收集控制器中的所有数据,但我无法弄清楚如何做到这一点。 有人建议我在控制器中做这样的事情:

 public static Result createOrder(String[] quantity, String[] productId, String[] price) { for(int i=0; i<quantity.length; i++){ ... } for(int i=0; i<productId.length; i++){ ... } for(int i=0; i<price.length; i++){ ... } } 

但问题是它需要我为Array[String]类型实现自定义隐式QueryStringBindable 。 对于这样一个基本function来说,这不是太多了吗?

所以我的问题是如何处理具有可变数量的具有相同名称的参数的表单? 比如,如何实现购物车,您可以在其中创建多个订单行(以完全随机的顺序),然​​后提交它们以创建订单?

PS:我已经尝试使用不同的名称(如[ productId0quantity0price0 ]为第一行,然后[ productId1quantity1price1 ]等等…)使用JavaScript,但它最终成为太复杂,无法保持索引准确…

我在这里找到了答案: https : //stackoverflow.com/a/20584282/2523628

解决方案是使用原始数据

 Map params = request().body().asFormUrlEncoded(); 

所有值都存储在如下所示的Map中:

 userId - 1 orderDate - 2014-09-10T14:21 productId[] - 21 - 61 quantity[] - 1 - 2 price[] - memberPrice - memberPrice status - processed 

然后只需手动解析值。 看起来这些值在每个数组中以相同的顺序存储,所以我仍然可以知道哪些匹配(这只是猜测)。

此外,括号表示法是没用的。 如果删除,则数据仍然相同,顺序相同。

我仍然想知道是否还有其他解决方案,尤其是使用自动绑定function的解决方案。