我在Play Framework 2.4中获得了正常的play.api.data.Form
。我在我的Action中进行了基本验证,但就我而言,即使用户提交的数据在语法上是正确的,我也可能需要根据外部服务的结果添加错误。
我从JSON对象获取带有错误消息的错误字段,例如:
{
"name": [
"Invalid name"
],
"age": [
"Invalid age",
"Something else"
]
}
我可以将此JSON对象转换为Seq[FormError]
:
val fields: Seq[(String, JsValue)] = jsObjErrorFields.fields
val formErrors: Seq[FormError] = fields map { case(key, jsValue) =>
val messages: Seq[String] = jsValue.asOpt[Seq[String]] getOrElse Seq()
FormError(key, messages)
}
我知道withError
类的Form
方法,但它只需要一个FormError
参数:
def withError(error: FormError): Form[T] = this.copy(errors = errors :+ error, value = None)
我觉得必须有一个简单的解决方案(地图,对......?),但我无法弄明白。
val formWithErrors = ...
感谢您的帮助!
答案 0 :(得分:0)
在行动中,而不是:
val
将表单实例保留在fold
,然后val form = MyForm.bindFromRequest
form.fold( // ...
formWithErrors => { /* ... */ },
data => {
// ...
// Copy the form and apply the errors from JSON:
val formWithErrors = form.copy(errors = formErrors)
// ...
}
)
:
<body>
<div id="result"></div>
</body>
<script>
var result = document.getElementById("result")l
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("sse.php");
source.onmessage = function(event) {
result.innerHTML += event.data + "<br>";
};
} else {
result.innerHTML = "Sorry, your browser does not support sse";
}
</script>