播放框架-URL中的变量而不是as?参数



我刚开始学习Play,所以这是一个基本问题,但我已经搜索了我能想到的每个术语,但找不到答案。

我所想做的就是让一个页面在提交时从文本字段中获取ID,并将其直接放入URL中(例如/myservice/person/123)。相反,生成的URL包含ID作为参数(例如/myservice/pperson?ID=123)。

如果我手动键入URL,我知道我的控制器被正确调用,所以我倾向于认为我的路由文件是正确的。这就是我的条目:

GET   /person/:id    controllers.PersonActions.getPerson(id: String) 

所以我假设我的模板出现了问题,它看起来像这样:

@form(routes.PersonActions.getPerson(personID)) {
    @* @inputText(personForm("id")) *@
    <input type="text" name="id" value="@personID">
    <input type="submit" value="Get">
}

您可以看到,我也使用@inputText以另一种方式进行了注释,但对我来说,它的行为完全相同。我不受这两种方法的约束。

我也尝试过使用POST,它从URL中完全删除ID,我也不理解,但由于我只是在做一个简单的查询,我宁愿使用GET。

有人能帮我了解这里发生了什么吗?我觉得路由/URL生成的工作原理有一些基本的东西我不理解,但我今天已经看了很多次教程和文档,我不知所措。

提前谢谢。

哦,我使用的是Java 7、Play 2.1和Eclipse Kepler

我认为您正试图跳过一个步骤,将表单请求数据从视图直接映射到控制器方法。您需要提交表单,让控制器解析数据,然后根据您从表单中解析的数据呈现下一个适当的视图。

请记住,视图中的personId是在呈现视图时绑定到服务器端的参数。在这种情况下,表单的submit url被硬编码为在呈现时传递给视图的任何personId——当输入框更改时,它不会动态更改。

要修复此问题,请添加一个控制器方法来接受来自/person的请求(我猜这是基于您问题中的部分,即表单正在提交给/person?id=123,在任何情况下,它都应该是您上面显示的表单的URL)

例如,如果您想使用GET方法添加表单:

GET     /person     controllers.PersonActions.findPerson(id: String)

以及在您的PersonActions控制器中(我假设您使用的是Java,如果是scala,我相信您可以从文档中调整它)

public static Result findPerson(String id){
    /*
     * I'm assuming this method exists and works because you say 
     * when you type in /person/123 manually the routing works 
     * and your router says getPerson is the method name for that URL.
     */
    return getPerson(id);
}

最新更新