定义错误,就像您在表单中创建 FormError("","Invalid Postal Code!") 对象一样,因为它没有键(第一个参数),框架不会将错误附加到表单元素。
在将请求绑定到表单时出现表单错误,您必须创建一个新表单,删除 FormError("","Invalid Postal Code!") 并将其替换为错误 FormError("form.id","message")
在我们的项目中,我们为 Form 创建了一个隐式定义来替换表单错误(我们找不到创建动态约束验证的方法),这是我们拥有的 2 个定义:
def replaceError(key: String, newError: FormError): Form[T] = {
val updatedFormErrors = form.errors.flatMap { fe =>
if (fe.key == key) {
if (form.error(newError.key).isDefined) None
else {
if (newError.args.isEmpty ) Some(FormError(newError.key,newError.message,fe.args))
else Some(newError)
}
} else {
Some(fe)
}
}
form.copy(errors = updatedFormErrors.foldLeft(Seq[FormError]()) { (z, fe) =>
if (z.groupBy(_.key).contains(fe.key)) z else z :+ fe
})
}
def replaceError(key: String, message: String, newError: FormError): Form[T] = {
def matchingError(e: FormError) = e.key == key && e.message == message
val oldError = form.errors.find(matchingError)
if (oldError.isDefined) {
val error = if (newError.args.isEmpty) FormError(newError.key,newError.message,oldError.get.args) else newError
form.copy(errors = form.errors.filterNot(e => e.key == key && e.message == message)).withError(error)
}
else form
}
我们在一个名为 FormCryptBind 的类中有这些(因为我们还用一些加密的东西改进了表单对象),我们像这样定义隐式 def:
implicit def formBinding[T](form: Form[T])(implicit request: Request[_]) = new FormCryptBind[T](form)
我们这样做是因为只需导入具有此隐式定义的对象,您就可以使用所有 FormCryptBind 定义,因为它们是 Form 的
我们就这样使用它
import whatever.FormImprovements._
...
object SomeController extends Controller{
...
def submit = Action{ implicit request =>
form.bindRequest.fold(
formWithErrors => {
val newForm = formWithErrors.replaceError("", "formField.required", FormError("formField", "error.required")
BadRequest(someView(newForm)
},
formDetails => Redirect(anotherView(formDetails))
}
由于我无法从应用程序中放置实际的实时代码,所以我稍微触摸了一下 :D 所以如果你复制和粘贴会出现编译错误