我刚开始学习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);
}