如何发布" id = 1& id = 2"在行动中,在play2?

时间:2012-03-14 10:40:36

标签: scala http-post playframework-2.0

我有一个包含一些行的表单,每个行都有一个复选框。用户可以选择其中一些,然后按“删除所选行”按钮进行提交。

发布的数据如下:

id=1&id=2&id=3

我想让他们付诸行动,我的代码是:

def delete = Action { implicit request =>
   Form("id"->seq(nonEmptyText)).bindFromRequest.fold(
      errors => BadRequest, 
      ids => {
         println(ids)    // (!)
         for(id<-ids) deleteRow(id)
      }
   )
}

但是我发现ID总是List(),一个空列表。

我已经检查了play2提供的“表单示例”,发现seq(...)只能使用这种格式的发布数据:

company sdfdsf
firstname   sdfds
informations[0].email   sdf@sdf.com
informations[0].label   wef
informations[0].phones[0]   234234
informations[0].phones[1]   234234
informations[0].phones[x]   
informations[1].email   sdf@sdf.com
informations[1].label   wefwef
informations[1].phones[0]   234234
informations[1].phones[x]   
informations[x].email   
informations[x].label   
informations[x].phones[x]   

请注意参数名称中有许多[0]或其他索引。

3 个答案:

答案 0 :(得分:4)

在这种情况下,您可以(并且可能希望)访问请求正文的URL编码内容,而不是使用Form帮助程序。

这样做的方法就是例如:

def delete = Action { implicit request =>
  request.body.asFormUrlEncoded match {
    case Some(b) =>
      val ids = b.get("id")
      for(id <- ids) deleteRow(id)
      Ok
    case None =>
      BadRequest
  }
}

答案 1 :(得分:3)

目前,这是Play2的一个严格限制。

整个表单绑定框架基于从/到Map[String,String]的转换,对于FormUrlEncoded和Json输入,这是通过丢弃除了每个键的第一个值之外的所有内容来完成的。

我正在尝试将所有内容更改为Map[String,Seq[String]],但目前还不清楚这种方法的兼容性。有关正在进行的工作,请参阅https://github.com/bartschuller/Play20/tree/formbinding(分支将在没有警告的情况下强制推送)。

批评,API建议和测试欢迎。

答案 2 :(得分:0)

如果您使发布的数据看起来像

id[0]=1&id[1]=2&id[2]=3

它应该有用。