【问题标题】:Repopulating form fields in Play Framework在 Play Framework 中重新填充表单字段
【发布时间】:2019-07-29 20:56:17
【问题描述】:

使用Play Framework (2.6) documentation;我正在尝试处理表单提交。但是我在重新填充表单字段时遇到了问题 - 如果它有错误,我想要这样做(这样用户可以编辑他们的条目而不必重新输入)。

   newForm.bindFromRequest.fold(

     errorForm => {
       BadRequest(views.html.form(errorForm))
     },
     formData => {
       val oWriteJso = Json.toJsObject(formData) match {
         case x if(x.fields.nonEmpty) => getCreatedFieldValues(x)
         case _ => None
       }
       val oRes = Redirect(routes.Application.index).flashing("success" -> "Entry saved!")
       apiC.writeAndRedirect("c", collName, None, oWriteJso)(oRes)(request)

     }

   )

我的问题是文档中的示例仅显示如何将errorForm 直接传递给表单模板(例如views.html.form),而不是能够再次呈现整个页面(即使用views.html.index 或@ 987654327@),输入表单字段是从上一个请求中填充的。我发现this answer 是最接近这个问题的,但它有点旧,我正在使用Scala,所以无法实现它。只是不知道其他人是如何做到的,也不知道明智的标准方法是什么。感谢您对此的任何启示_

【问题讨论】:

    标签: forms scala playframework twirl


    【解决方案1】:

    如果您使用 Play 辅助函数在视图文件中生成输入标签。它们应该填充您上次请求中的值。

    例如,您可以使用以下帮助方法在视图文件中创建 HTML 表单:

    @helper.form(action = routes.Application.userPost()) {
      @helper.inputText(userForm("name"))
      @helper.inputText(userForm("age"))
    }
    

    您可以在以下链接中查看有关视图文件中帮助程序的 Play 文档:

    https://www.playframework.com/documentation/2.7.x/ScalaForms#Showing-forms-in-a-view-template

    【讨论】:

    • 谢谢,但我可以在模板中显示输入表单(使用辅助方法) - 将错误表单传递给呈现整个页面的模板比较棘手。您提到“它们应该填充您上次请求中的值” - 如果调用诸如Redirect(routes.SspC.index) 之类的操作,则request 不包含任何表单数据。无论如何,我认为我可能必须将error form 发送到模板,将其转换为 HTML,然后将其作为可选参数发送到主模板
    • 实际上Html 无法发送到路由操作,所以仍然被这个难住了!
    • @jesusg_forceHarris 抱歉,我认为您无法在 BadRequest 部分中显示表单数据。如果您将用户重定向到另一个 URL,您将丢失表单数据的当前值。您应该返回带有如下表单数据的Ok 响应:val anyData = Map("username" -> "foo"); val formWithData = form.bind(anyData); Ok(views.html.user.userLogin(formWithData))
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多