gpt4 book ai didi

scala - Play Framework 2 : How to pass object between routes, View 和 Controller ?

转载 作者:行者123 更新时间:2023-12-01 07:26:18 24 4
gpt4 key购买 nike

我正在尝试将书籍对象从 View 传递到路由,然后将其发送到 Controller 中进行计算。我的代码如下:

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)
...

但是,它给了我一个错误: No QueryString binder found for type models.Book. Try to implement an implicit QueryStringBindable for this type.
我尝试将路线更改为:
    GET     /order                      controllers.Application.buy(book)

它也返回了一个错误:
type mismatch; found : String required: models.Book

最佳答案

这不是 Play 路由的工作方式。 Play 路由器从 URL 或查询字符串解析变量,并通过 QueryBindable 类型类将它们转换为原生类型。你应该有更多这样的东西:

路由

GET /order/:bookid           controllers.Application.buy(bookid: String)

Action 应该是这样的:

应用程序.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>
}

关于scala - Play Framework 2 : How to pass object between routes, View 和 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22832033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com