Play框架视图中的强类型表单字段

时间:2013-10-09 17:38:41

标签: scala playframework playframework-2.0

我们必须使用属性名作为字符串来在Play Framework视图中呈现HTML字段:

Scala的:

case class MyClass(myField: Int)

查看:

@(form: Form[MyClass])
...
@helper.inputText(form("myField"), '_label -> "Field Title")

这不是强类型

那么有没有办法以强类型的方式提及字段名称? 像这样:

@helper.inputText(form(model => model.myField), '_label -> "Field Title")

我确信这在Scala中是可行的,但幸运的是我们有宏,并且可以在没有任何运行时开销的情况下实现这样的代码。

1 个答案:

答案 0 :(得分:2)

不要将字符串视为属性的名称,而是将 字符串的表单字段ID /名称视为一个字符串,因为Form模拟表单而不是主要是对象(可能甚至非常有用的模型形式与元组作为数据结构,例如)。这确实是强类型的,因为除了字符串之外你不能发送任何东西。

您的问题是,您希望更多地使用类型系统,将实际值编码为类型或某些东西,以避免拼写错误等。

我认为你可以采取一些方法,有各种各样的好处和问题:

  • 编写自己的表单api并使用类型系统以某种方式识别字段ID
  • 强制使用常量作为项目中的键,而不是使用类型系统,而只是决定这样做
  • 为表单构建器和表单助手编写自己的包装器,接受一些更受限制的类型作为键
  • 将您的模型字段表示为某种“属性”类型,并将其与表单构建器和表单助手的自定义包装器相结合。

这些都没有真正发挥作用,除了常量方法之外的所有方法都会让你编写或多或少复杂的代码,所以你必须权衡这个解决这个问题的实际收益对你来说是值得的。 / p> 祝你好运!