多个可选参数 - 如何使用路径和模板

时间:2013-08-09 11:14:33

标签: playframework playframework-2.1

因为我从Play框架开始(2.1.3) 这似乎是一个简单的问题,但我还没有想出解决方案。

也许有一种完整的其他方法可以让它发挥作用,这就是为什么我没有找到这方面的例子。

我想根据三个可选过滤器值显示值列表。

我的控制器接受三个参数

public static Result index(Integer filterA, String filterB, String filterC)

向其发送请求的路线

GET / controllers.Teachers.index(filterA :Integer = null, filterB = null, filterC = null)

这将接受localhost:9000/?filterA=10&filterB=20&filterC=test

等网址

只需单击一个值就可以通过三个列表选择过滤器,因此模板中的链接看起来像

<a href="@routes.Teachers.index()?filterA=10">Value for filter A</a>
<a href="@routes.Teachers.index()?filterB=20">Value for filter B</a>
<a href="@routes.Teachers.index()?filterC=test">Value for filter C</a>

我认为这不是“游戏方式”,因为我发挥了生成URL的控制权。另外,当我想要将两个过滤器放在一起时,我必须将选择过滤器传递给我的模板(参数或会话),并具有如下复杂的链接:

<a href="@routes.Teachers.index()?filterA=10&filterB=@selectedB&filterC=@selectedC">Value for filter A</a>
<a href="@routes.Teachers.index()?filterA=@selectedA&filterB=20&filterC=@selectedC">Value for filter B</a>
<a href="@routes.Teachers.index()?filterA=@selectedA&filterB=@selectedB&filterC=test">Value for filter C</a>

所以在我看来,这是一个非常常见的用例,但我还没想出如何在游戏中轻松做到这一点:)

1 个答案:

答案 0 :(得分:4)

您必须通过在模板中向其传递参数来调用该操作:

<a href="@routes.Teachers.index(10, null, null)">Value for filter A</a>
<a href="@routes.Teachers.index(null, 20, null)">Value for filter B</a>
<a href="@routes.Teachers.index(null, null, "test")">Value for filter C</a>

因此您不必将默认值放在routes文件中:

GET / controllers.Teachers.index(filterA :Integer, filterB :Integer, filterC: String)

或者,如果您想让它们保持可选,您可以在模板中使用以下内容进行调用:

<a href="@routes.Teachers.index(filterA = 10)">Value for filter A</a>
<a href="@routes.Teachers.index(filterB = 20)">Value for filter B</a>
<a href="@routes.Teachers.index(filterC = "test")">Value for filter C</a>

使用以下路线:

GET / controllers.Teachers.index(filterA : Int ?= 0, filterB ?= null, filterC ?= null)

请注意,Java的Integer应该是路径文件中的Scala Int

public static Result index(Integer filterA, String filterB, String filterC) {
    if (filterA == 0 && filterB == null && filterC == null) {
        return badRequest("No filter data...");
    }
    return ok("some filtering");
}