scala – Play框架2:如何在路由,视图和控制器之间传递对象?
发布时间:2020-12-16 09:08:07 所属栏目:安全 来源:网络整理
导读:我正在尝试将一个book对象从视图传递到路由,然后将其发送到控制器中进行计算.我的代码如下: bookList.scala.html @(books: java.lang.Iterable[Book])@main("BookList"){ div class="row" @for(book - books.iterator()){ div class="col-sm-6 col-md-4" di
我正在尝试将一个book对象从视图传递到路由,然后将其发送到控制器中进行计算.我的代码如下:
bookList.scala.html @(books: java.lang.Iterable[Book]) @main("BookList"){ <div class="row"> @for(book <- books.iterator()){ <div class="col-sm-6 col-md-4"> <div class="thumbnail" style="height: 435px"> ... <p><a href="@routes.Application.buy(book)" class="btn btn-primary" role="button" style="vertical-align:bottom">Order now!</a> </div> </div> </div> } </div> } 路线 ... GET /order controllers.Application.buy(book: models.Book) ... 但是,它给了我一个错误:找不到类型models.Book的QueryString绑定器.尝试为此类型实现隐式QueryStringBindable. 我试图改变路线: GET /order controllers.Application.buy(book) 它还返回了一个错误: type mismatch; found : String required: models.Book 解决方法
这不是播放路由的工作原理. Play路由器解析URL或查询字符串中的变量,并通过QueryBindable类型类将它们转换为本机类型.你应该有更像这样的东西:
路线 GET /order/:bookid controllers.Application.buy(bookid: String) 行动应该是这样的: Application.scala def buy(bookid: String) = Action { request => // Look up book by id here. Ok(views.html.thanks("you bought a book!")) } 这样的模板: bookList.scala.html @for(book <- books.iterator()) { ... <a href="@routes.Application.buy(book.id)" class="btn btn-primary" } 当然,如果模型的ID不是String,则需要修改路径的参数类型 更新 – 使用表单/ POST替代 使用POST方法的表单是更好的解决方案,或者用户每次单击URL时都会购买另一本书,并且ID将被公开.查看forms文档.你的模板是这样的: @for(book <- books.iterator()) { ... <form method="post"> <div>@book.name</div> <input type="hidden" value="@book.id"/><button type="submit">buy</button> </form> } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |