【问题标题】:Playframework [Scala]: Binding a list/seq to the controllerPlayframework [Scala]:将列表/序列绑定到控制器
【发布时间】:2018-08-17 17:22:13
【问题描述】:

我正在尝试将我的 html 页面上的输入项列表绑定到我的控制器。

我的表单定义为:

def clientForm = Form( tuple(
       "clients[]" -> seq( tuple(
          "firstname" -> text,
          "lastname" -> text) )
    ) )

在我的 HTML 中,我尝试了以下方法:

@b3.text(thisForm("clients[0]"), '_label -> "first client", 'value -> "('John','Snow')")
@b3.text(thisForm("clients[1]"), '_label -> "second client", 'value -> "('Frank','Carson')")

我也试过了:

@b3.text(thisForm("clients[0].firstname"), '_label -> "first client fistname", 'value -> "John")
@b3.text(thisForm("clients[0].lastname"), '_label -> "first client lastname", 'value -> "Snow")
@b3.text(thisForm("clients[1].firstname"), '_label -> "second client fistname", 'value -> "Frank")
@b3.text(thisForm("clients[2].lastname"), '_label -> "second client lastname", 'value -> "Carson")

在调试模式下,我可以看到这些值绑定到控制器内的表单:

val boundFrom = inForm.bindFromRequest

但是当我将boundForm.fold 映射到clientForm 时,这些值无法正确映射到我的"clients[]" 元素。

我不知所措,花了很长时间寻找答案却无济于事。

非常感谢任何帮助

编辑: 这是调试模式下的屏幕截图。这些值被绑定到表单,但随后没有被分配。 Debug screenshot

【问题讨论】:

  • 您在.fold 错误块中遇到的错误是什么?
  • 我的折叠块中没有任何错误
  • 如果你的clientForm 只有clients[],为什么它是tuple

标签: html scala list playframework


【解决方案1】:

请注意,您的表单定义可以如下 -

def clientForm = Form( 
    single(
        "clients[]" -> seq(
            tuple(
                "firstname" -> text,
                "lastname" -> text
            ) 
        )
    ) 
)

那么您编写模板的第二种方式是正确的,您可以在此处的文档中看到 https://www.playframework.com/documentation/2.6.x/ScalaForms#Repeated-values

现在,当你折叠这个表单时,你会得到一个元组序列,你可以像下面这样使用它 -

clientForm.bindFromRequest.fold(
    error => // Handle error
    clients => {// this clients is of signature Seq[(String, String)]
        clients.map{client => logger.log("First name: " + client._1 + ", Last name: " + client_2)}
    }
)

请注意,您必须使用元组 ._1 和 ._2 在此处访问您的名字和姓氏。因为你在这里得到一个元组 (String, String) 而不是 Map[String, String]。

【讨论】:

  • 感谢您的回复塔伦。我为我的问题稍微简化了我的表单,但 clients[] 实际上是元组中的许多字段之一。我仍然遇到同样的问题。当我绑定表单并在调试器模式下查看时,我可以看到 clientForm.data[0] = clients[0].firstname,然后是 clientForm.data[4] = clients[0].lastname。我希望一旦折叠,这种随机的数据索引(假设我的元组中有 4 个元素,一个元素是 seq)会被整理并正确填充我的变量。可惜没有。
  • clientForm.data 显示了我在绑定表单中需要的值,但 clientForm.value 只是有 Some(List())
  • 你能告诉我确切的形式以及你在 fold 方法中得到什么变量吗?
  • 我删除了所有内容并使用了您的表单(使用单个表单)并获得了您在我编辑的帖子中看到的屏幕截图。也许是因为我使用的是 IntelliJ Community 或 SBT。我不知道。现在我刚刚重写了我的表单以避免使用 seq
  • 请不要理会 clienForm.data 或 client.value 它是数据的内部表示,处于中间状态(屏幕截图中的进程绑定可能尚未完成)。使用 fold 方法,并且在该方法中仅对经过验证的表单数据进行进一步处理。我相信您可能会在 fold 方法中的“clients”变量中获得完全相同的值,如上面的答案所示。我还添加了一条日志消息,记录了表单中提交的所有值,以说明如何使用“clients”变量中的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
相关资源
最近更新 更多