4

我拼命地尝试从表单提交中接收值列表并将其绑定到对象列表。

有效的是检索单行:

//class
case class Task(name: String, description: String)

val taskForm: Form[Task] = Form(
  mapping(
  "name" -> text,
  "description" -> text

  )(Task.apply)(Task.unapply)
)


//form
<tr>
  <td><input name="name" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="description" class="autoexpand span7" rows="1"     placeholder="Description..."></textarea>
  </td>
</tr>

//receiving action:
val task = taskForm.bindFromRequest.get

但是现在我想提交多个任务类型的对象,例如:

<tr>
  <td><input name="name[0]" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="description[0]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>                   
</tr>
<tr>
  <td><input name="name[1]" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="description[1]" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>                   
</tr> 

现在执行 taskForm.bindFromRequest.get 失败。

有人想出解决方案吗?还是您对这种情况的处理方式完全不同?

4

2 回答 2

17

好吧,感谢您提示我再次查看文档,我已经看过它们,但永远无法弥补如何将其组合以使其工作。我认为这是因为我是一个完全的 scala 菜鸟。但是,我在给它一段时间后让它工作了,这是我的解决方案:

//classes
case class Task(name: String, description: String)
case class Tasks(tasks: List[Task])

val taskForm: Form[Tasks] = Form(
  mapping(
  "tasks" -> list(mapping(
    "name" -> text,
    "description" -> text
  )(Task.apply)(Task.unapply))
)(Tasks.apply)(Tasks.unapply)
)

//form
<tr>
  <td><input name="tasks[0].name" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="tasks[0].description" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>                   
</tr>
<tr>
  <td><input name="tasks[1].name" type="text" class="span2" placeholder="Name..."></td>
  <td><textarea name="tasks[1].description" class="autoexpand span7" rows="1" placeholder="Description..."></textarea></td>                   
</tr>

最后做一个:

val tasks = taskForm.bindFromRequest.get

检索任务列表。

于 2012-04-19T07:26:25.093 回答
2

从 playframework 文档页面

重复值

表单映射也可以定义重复值:

case class User(name: String, emails: List[String])

val userForm = Form(
  mapping(
    "name" -> text,
    "emails" -> list(text)
  )(User.apply, User.unapply)
)

当您使用这样的重复数据时,浏览器发送的表单值必须命名为 emails[0]、emails[1]、emails[2] 等。

于 2012-04-19T00:05:00.800 回答