我有一个包含一些行的表单,每个行都有一个复选框。用户可以选择其中一些,然后按“删除所选行”按钮进行提交。
发布的数据如下:
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]
或其他索引。
答案 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
它应该有用。