使用play框架的纯动态表单

时间:2014-03-18 16:06:08

标签: playframework playframework-2.2

我有一个Play 2.2应用程序,通过外部Web服务获取带有字段名称,类型和约束信息的JSON;这个JSON的内容每次都可以不同(虽然整体结构保持不变,只有字段数量的差异等)。 现在要求是根据收到的字段定义呈现HTML表单。 有人可以建议最好的方法吗(我不认为通常的游戏形式在这里非常有用,除非有人能说出如何创建动态的MappingForm对象)。 我的一个想法是将JSON发送到客户端并使用Angular呈现表单,但后来我不确定如何在服务器端验证它。

2 个答案:

答案 0 :(得分:1)

播放表单是类型安全的,这意味着表单内容是静态定义的(即元组或案例类)。您必须编写代码以动态生成表单并解析结果。

在Scala模板中生成表单的HTML有点过于复杂。我建议在对象中编写一个函数来执行此操作,例如:

object MyHelpers {
  def makeForm(js: JsObject): Html = {
    val xml = 
    <form method="post">
      { js.values.map { e =>
        <input type=text name={e._1} value={e._2}/>
      }}
    </form>

    Html(xml.toString)
  }
}

然后在模板中导入该功能:@import MyHelpers.makeForm,并在页面中您想要表单的位置调用该功能。

使用Action解析表单结果(在这种情况下必须在路由文件中指定为POST),如下所示:

def myFormHandler(parse.multipartFormData) { request =>
  val data = for ((key, values) <- request.body.dataParts) yield {
    // validate and process field
  }

  OK(view.html.myform())
}

(如果您的行为属于GET,您可能不想要,请使用parse.asFormUrlEncoded

答案 1 :(得分:0)

使用freemarker作为Play框架中的模板游戏形式解决方案。我做了类似的工作相关项目的概念验证。 https://github.com/rabbipal/Play-2.1-Java-MongoDb-Freemarker-Dynamic-Form。希望它有所帮助。