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