Как получить опубликованное "id = 1 & id = 2" в действии, в play2? - PullRequest
4 голосов
/ 14 марта 2012

У меня есть форма, которая содержит несколько строк, у каждой есть флажок в начале.Пользователь может выбрать некоторые из них, а затем нажать кнопку «Удалить выбранные строки» для отправки.

Опубликованные данные выглядят следующим образом:

id=1&id=2&id=3

Я хочу получить их в действии, мой код:

def delete = Action { implicit request =>
   Form("id"->seq(nonEmptyText)).bindFromRequest.fold(
      errors => BadRequest, 
      ids => {
         println(ids)    // (!)
         for(id<-ids) deleteRow(id)
      }
   )
}

Но я обнаружил, что идентификаторы всегда были List(), пустой список.

Я проверил «Образцы форм», предоставленные play2, и обнаружил, что seq(...) следуетРаботает только с опубликованными данными в таком формате:

company sdfdsf
firstname   sdfds
informations[0].email   sdf@sdf.com
informations[0].label   wef
informations[0].phones[0]   234234
informations[0].phones[1]   234234
informations[0].phones[x]   
informations[1].email   sdf@sdf.com
informations[1].label   wefwef
informations[1].phones[0]   234234
informations[1].phones[x]   
informations[x].email   
informations[x].label   
informations[x].phones[x]   

Обратите внимание, что в именах параметров много [0] или других индексов.

Ответы [ 3 ]

4 голосов
/ 14 марта 2012

Вместо использования Form помощника в этом случае вы можете (и, вероятно, захотите) получить доступ к URL-адресу содержимого тела запроса.

Способ сделать это, например:

def delete = Action { implicit request =>
  request.body.asFormUrlEncoded match {
    case Some(b) =>
      val ids = b.get("id")
      for(id <- ids) deleteRow(id)
      Ok
    case None =>
      BadRequest
  }
}
3 голосов
/ 15 марта 2012

В настоящее время это жесткое ограничение в Play2.

Вся структура привязки формы основана на переводе с / на Map[String,String], и для ввода в FormUrlEncoded и Json это достигается путем удаления всего, кроме первогозначение для каждого ключа.

Я экспериментирую с изменением всего на Map[String,Seq[String]], но пока неясно, насколько совместим этот подход.См. https://github.com/bartschuller/Play20/tree/formbinding о незавершенной работе (ветка будет принудительно вставлена ​​без предупреждения).

Критика, предложения API и тесты приветствуются.

0 голосов
/ 16 апреля 2012

Если вы сделаете опубликованные данные похожими на

id[0]=1&id[1]=2&id[2]=3

Это должно сработать.

...