forms - Scala/Play 框架 : How to modify fields in Form object before validation

标签 forms scala validation playframework playframework-2.0

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.dataMap[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/

相关文章:

scala - flatMap 编译错误发现 : TraversableOnce[String] required: TraversableOnce[String]

scala - Circe Scala - 编码和解码 Map[] 和案例类

java - 在 Eclipse IDE 中使用 Scala 代码。内部编译器错误

javascript - 验证失败时文本字段周围有红色边框

validation - 如何覆盖 FOSUserBundle 中的密码验证

Javascript 构造函数属性在调用时不起作用

css - 表格,水平对齐姓名和电子邮件

html - 从用作图标的重叠背景图像中停止占位符/输入文本?

jQuery:在表单提交时,更改表单的样式类

php - 插入数据时避免 MySQL 中出现重复条目​​?