无法使用Play for Scala在窗体中绑定给定的Map



我无法将值绑定到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"))

注意:如果您是从请求数据绑定的,那么只使用[]作为后缀就足够了,但当从具有字符串值的映射绑定时,这不起作用,因为您需要消除键的歧义。

您也可以将bindFromRequestMap[String,Seq[String]]参数一起使用,并且不必指定确切的索引:

theSearchForm.bindFromRequest(Map("fq_chset[]" -> Seq("Value1")))

最新更新