Web 应用程序中最简单的事情之一应该是从 HTML 表单中读取字段。 play 框架提供了 Form 类来验证和映射这些答案。只要您不想做特殊的事情,它就可以正常工作。
我发现与
val newform = user.copy(errors = user.errors++Seq(FormError("email", "Already registered")), data = user.data + ("username"->"correctedName")
我可以在重新显示表单之前修改错误和字段。
但是如何修改字段之前 他们得到验证?
最好删除不需要的空格,将“11.05.2014”转换为“11-May-2014”等等。
最佳答案
您也许可以在 Form
内完成此操作如果你让你的验证规则更加宽松( nonEmptyText
而不是 email
对于带有不需要的空格的电子邮件),请使用 transform
清理输入,然后 verifying
实现实际的验证规则。那可能最终会非常丑陋,所以我不会继续走这条路。
我认为你唯一的好选择可能是在调用 bindFromRequest
之前通过过滤器传递表单数据.假设您使用的是 parse.urlFormEncoded
BodyParser
(你应该是),然后 request.data
是 Map[String, Seq[String]]
.
这是一个粗略的过滤器示例,但是任何可以接受 Map[String, Seq[String]]
的东西,并返回一个新的 Map[String, Seq[String]]
用清理过的数据。
def cleanUserForm(data: Map[String, Seq[String]]): Map[String, Seq[String]] = {
data.map{ case (key, values) =>
if(key == "email") (key, values.map(_.replaceAll(" ", ""))) // trim whitespace from email
else (key, values)
}
}
然后在您的 Controller 中,您必须明确地将清理过的数据传递给
bindFromRequest
(通常接受隐式请求):def register = Action(parse.urlFormEncoded) { request =>
val incomingData = request.body
val cleanData = cleanUserForm(incomingData)
userForm.bindFromRequest(cleanData).fold(
formWithErrors => ...
user => ...
)
}
val userForm: Form[User] = Form {
...
}
关于forms - Scala/Play 框架 : How to modify fields in Form object before validation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24354586/