Play framework使用AJAX根据选定的国家Id显示数据库中的状态列表

Play framework使用AJAX根据选定的国家Id显示数据库中的状态列表,ajax,scala,playframework-2.3,Ajax,Scala,Playframework 2.3,我是一个使用Scala框架的新手。目前在我的项目登记表中,我在下拉列表中有国家和州的选项。我需要显示所选国家的州列表。为此使用AJAX调用,我使用了下面的代码片段。但它表明 Cannot write an instance of Seq[(String, String)] to HTTP response. Try to define a Writeable[Seq[(String, String)]] 我试过的 addStudent.scala.html 路线 斯卡拉学生会 学生斯卡拉 您

我是一个使用Scala框架的新手。目前在我的项目登记表中,我在下拉列表中有国家和州的选项。我需要显示所选国家的州列表。为此使用AJAX调用,我使用了下面的代码片段。但它表明

Cannot write an instance of Seq[(String, String)] to HTTP response. 
Try to define a Writeable[Seq[(String, String)]]
我试过的

addStudent.scala.html

路线

斯卡拉学生会

学生斯卡拉


您正试图将stateList.optionscountryId中的Seq[String,String]呈现为操作体,但尚未告诉Play如何序列化它。您可以定义一个可写的脚本,告诉Play如何将您的Seq转换为您的客户将知道如何阅读的内容。假设您正在寻找一个简单的字符串,因此您的可写字符串可能希望是一个非常简单的转换,或者您甚至可以将OkstateList.optionscountryId更改为OkstateList.optionscountryId.mkString[,,,,]。

根据您现有的代码,如果我正确理解了这个问题,输出JSON的快速方法是

OK(JsArray(stateList.options(countryId).map{case (id, name) =>
  JsObject(Seq(
    "id"   -> JsString(x.id),
    "name" -> JsString(x.name)
  ))
}))

您需要指出错误的确切来源我添加了上面的代码段,但它显示Int不带参数error您可以提供任何示例吗?我使用OkstateList.optionscountryId.mkString[,,,]此代码在onSuccess methods alert中显示StateList:=[1,tamilnadu,2,kerala]。如何将此字符串转换为Seq[String,String],以便在下拉列表中显示您不需要的值。现在您已经有了一个要在javascript中解析的对象。不过,这并不是一个非常友好的解析方法。考虑在文档的另一个答案中使用JSON。解析响应后,需要在选择框中设置值。我使用了John提到的JsArray选项,它显示Int不带参数。Live Evans您能告诉我如何将结果设置为JSON,以及如何将JSON字符串解析为Seq[string,string]
package controllers

import play.api.Routes
import play.api.mvc.Action
import play.api.mvc.Controller
import play.api.mvc.EssentialAction
import play.core.Router.JavascriptReverseRoute
import play.core.Router._
import routes.javascript.Application.index
import routes.javascript.Students.ajaxCall

object JavascriptRoute extends Controller {

  /* Application related JavascriptReverse Route will goes here */
  val appRoutes: List[JavascriptReverseRoute] = List(index, ajaxCall)

  /* All JavascriptReverse Route will combine here */
  val javascriptRouters = appRoutes

  /**
   * This is use to generate JavascriptReverseRoute for all provided actions
   *
   * @return
   */
  def javascriptRoutes: EssentialAction = Action { implicit request =>
    import routes.javascript._
    Ok(Routes.javascriptRouter("jsRoutes")(javascriptRouters: _*)).as("text/javascript")
  }

}
GET    /ajax-call/:countryId         controllers.Students.ajaxCall(countryId:String)

#Javascript Routes
GET    /javascriptRoutes            controllers.JavascriptRoute.javascriptRoutes
 def ajaxCall(countryId:String) = Action { implicit request =>     
   Ok(stateList.options(countryId))          
}
case class stateList(stateid:Option[Int] = None,
                      statename: String)

object stateList{

  val simple = {
    get[Option[Int]]("state.STATE_ID") ~
    get[String]("state.STATE") map {
      case stateid~statename => stateList(stateid,statename)
    }
  }

  def options(countryId:String): Seq[(String,String)] = DB.withConnection { implicit connection =>
 SQL("select * from state WHERE COUNTRY_ID = {countryid}")
 .on('countryid->countryId)
 . as(stateList.simple *).      
      foldLeft[Seq[(String, String)]](Nil) { (cs, c) => 
        c.stateid.fold(cs) { id => cs :+ (id.toString-> c.statename) }
      }
  }
}
OK(JsArray(stateList.options(countryId).map{case (id, name) =>
  JsObject(Seq(
    "id"   -> JsString(x.id),
    "name" -> JsString(x.name)
  ))
}))