【问题标题】:bind multiple objects in play framework 2.0 from a form从表单绑定多个对象在play framework 2.0中
【发布时间】:2012-04-18 22:09:53
【问题描述】:

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

有效的是检索单行:

//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 现在失败了。

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

【问题讨论】:

    标签: forms scala binding playframework-2.0


    【解决方案1】:

    嗯,感谢您提示我再次查看文档,我已经看过它们,但永远无法弥补如何将其组合以使其工作。我认为这是因为我是一个完全的 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
    

    检索任务列表。

    【讨论】:

    • 哇,你成功了。对于那些遇到麻烦的人,让我感到困惑的部分是将list() 包裹在子地图周围
    • 但是绑定一个相同对象类型的列表怎么样? (类似:case class Person(name: String, friends: List[Person]) ?)
    • 这很好,但是从 Java 中执行此操作怎么样?最基本的 Java 框架很容易做到这一点。很震惊这在 Play 中不存在。
    【解决方案2】:

    来自 playframework 文档page

    重复值

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

    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] 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-28
      • 2013-04-30
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      相关资源
      最近更新 更多