在Play框架中使用可选的GET参数进行反向路由

3

我正在使用Scala 2.10和Playframework 2.2.1

让我们假设以下路由:

GET    /users/page/:page/limit/:limit    controllers.Users.showUsers(page: Int, limit: Int)

我想要添加一个带有GET方法和几个字段的搜索表单,同时还要添加一些分页。例如,在表单提交后,url将如下所示:

http://example.com/users/page/1/limit/20?login=someLogin&email=

为避免在分页代码中硬编码url,我在我的模板中使用反向路由,例如@routes.Users.showUsers(currentPage, limit)。是否可以在结果url中也添加GET参数,而不需要像在模板中通过Formfold等丑陋的代码呢?

1个回答

4

是的,有点类似。在Play 2.2中已经移除了可选路由参数,因此您必须为分页参数定义默认值。反向路由器将知道如何填充它们。

GET    /users/page/:page/limit/:limit       controllers.Users.showUsers(page: Int, limit: Int, login: String ?= "", email: String ?= "")

object Users extends Controller {

     def showUsers(page: Int, limit: Int, login: String = "", email: String = "") {
          // show those users..
     }
}

@routes.Users.showUsers(3, 20, "someLogin") 会生成URL: /users/page/3/limit/20?login=someLogin

虽不是特别美观,但比硬编码URL要好得多。


是的,这还算可以。但就我所见,没有机会使用一个“表单”来处理请求中的所有GET参数,而不是手动路由。 - Sergey Kolbasov
你是什么意思?如果你能更详细地解释你想做什么,可能就有可能了。 - Michael Zajac
例如,在创建Form时,如果在showUsers中使用隐式的bindFromRequest变体,则无需手动将登录和电子邮件字段放入routes.conf和showUsers中。 假设我的表单中有22个字段。 在routes.conf中有22个参数,在showUsers中也有22个参数。 这有点可怕。 - Sergey Kolbasov
我仍然不太明白你想做什么。如果你不想在GET请求中有22个参数,那么你可以使用Form或者json作为请求体。无论哪种方式,你都需要折叠请求体。这并不被认为是丑陋的,它是处理错误的一种好方法。还有其他提取参数的方法,但那些方法要丑陋10倍。根据你所描述的,我还不知道足够多的信息。 - Michael Zajac
我想使用Form来处理22个参数,并将这些参数添加到分页的href中,而不需要折叠等操作,只需使用反向路由或其他简单的方式即可。但似乎这是不可能的。 - Sergey Kolbasov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接