我无法将值绑定到Form[M]中。因为List,它似乎不起作用:如果我把List[String]变成String,它就起作用了。这是代码
case class SearchCriteria (
val q: Option[String],
var fq_chset: List[String]
)
val theSearchForm: Form[SearchCriteria] = Form(
mapping(
"q" -> optional(text),
"fq_chset" -> list(text)
)
)(SearchCriteria.apply _)(SearchCriteria.unapply _)
def foldSearchCriteria(searchForm: Form[SearchCriteria]): Either[Throwable, SearchCriteria] = {
foldForm[SearchCriteria](searchForm, { searchCriteria =>
Logger.debug(searchCriteria.toString())
Right(searchCriteria)
})
}
def foldForm[F](aForm: Form[F], onSuccess: F => Either[Throwable,F]): Either[Throwable,F] = {
aForm.fold(
hasErrors = { form =>
Left(new RuntimeException("Errors while folding Form"))
},
success = { formData =>
onSuccess(formData)
}
)
}
我得到的是:
foldSearchCriteria(theSearchForm.bind(Map("q" -> "ValueQ")))
>> SearchForm( Some(ValueQ), None ) )
foldSearchCriteria(theSearchForm.bind(Map("fq_chset" -> "Value1")))
>> SearchForm( None, Some(List()) )
知道吗?
为了绑定列表值,键必须附加列表索引(例如[0]
、[1]
)。试试这个:
theSearchForm.bind(Map("fq_chset[0]" -> "Value1"))
注意:如果您是从请求数据绑定的,那么只使用[]
作为后缀就足够了,但当从具有字符串值的映射绑定时,这不起作用,因为您需要消除键的歧义。
您也可以将bindFromRequest
与Map[String,Seq[String]]
参数一起使用,并且不必指定确切的索引:
theSearchForm.bindFromRequest(Map("fq_chset[]" -> Seq("Value1")))