2

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

我想要做的就是有一个页面,在提交时从文本字段中获取一个 ID 并将其直接放在 URL 中(例如 /myservice/person/123)。相反,正在生成的 URL 包含 ID 作为参数(例如 /myservice/person?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

4

1 回答 1

1

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

请记住,视图中的 personId 是在呈现视图时绑定到服务器端的参数。在这种情况下,表单的提交 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);
}
于 2013-08-01T22:00:45.960 回答