在我的Find控制器中,我有一个方法:
public Result findLatest(String repoStr) {
............
}
通过路线链接:
GET /latest controllers.Find.findLatest(repo: String)
然后,我在一个视图中有一个表单:
<form action="@routes.Find.findLatest()" method="get">
....
<select name="repo">....</select>
</form>
但显然这是失败的,因为它期待一些我在动作中没有实现的参数。在没有最终让findLatest方法在我的控制器中没有参数的情况下,这样做的正确方法是什么?
答案 0 :(得分:1)
您可以更改路线以接受空字符串:
GET /latest/:repo controllers.Find.findLatest(repo: String = "")
然后配置您的控制器功能以处理空字符串。
那样,
<form action="@routes.Find.findLatest()" method="get">
....
<select name="repo">....</select>
将在控制器级别将repo
评估为空字符串。
答案 1 :(得分:1)
修改:在Play v 2.1中删除了对此实施的支持
您可能对Play的可选参数感兴趣,例如play.libs.F.Option [字符串]
示例:How to handle optional query parameters in Play framework
GET /latest/:repo/:artifact controllers.Find.findLatestArtifact(repo: play.libs.F.Option[String], artifact: play.libs.F.Option[String])
这将允许您灵活地提供需要提供的参数。
不确定您使用的语言,但上面的链接包含scala的示例,java中的方法声明如下所示:
import play.libs.F.Option;
public static Result findLatestArtifact(Option<String> repo, Option<String> artifact){ ... }
并更新实施2.1 Routes with optional parameter - Play 2.1 Scala
编辑:播放2.1+支持:@RobertUdah道具
初始化为null:
GET /latest/ controllers.Find.findLatest(repo: String = null)
GET /latest/:repo controllers.Find.findLatest(repo: String)
<form action="@routes.Find.findLatest()" method="get">
答案 2 :(得分:0)
通常情况下,所有表单数据都会显示在正文中,您可以使用bindFromRequest()
在操作方法中检索它们(请参阅docs)。
如果您确实想要将一个表单元素作为URL的一部分传递,那么您必须使用JavaScript动态编写URL并更改路径。
您的路线可能如下:
GET /latest/:repo controllers.Find.findLatest(repo: String)
JavaScript部分(我实际上没有测试代码):
<form name="myform" action="javascript:composeUrl();" method="get">
....
<select name="repo">....</select>
</form>
<script>
function submitform() {
var formElement = document.getElementsByName("myform");
var repo = formElement.options[e.selectedIndex].text;
formElement.action = "/lastest/" + repo;
formElement.submit();
}
</script>
答案 3 :(得分:0)
Cavice建议接近我认为最好的解决方案(因为Play 2.1中的默认绑定器不再支持F.Option)。
我最终离开了路线,如:
GET /latest controllers.Find.findLatest(repo=null)
和视图一样:
<form action="@routes.Find.findLatest(null)" method="get">
<select name="repo"> .... </select>
....
</form>
并在控制器中:
public Result findLatest(String repoStr) {
if(repoStr==null) {
repoStr=Form.form().bindFromRequest().get("repo");
.....
这允许我有第二条路线,如:
GET /latest/:repo controllers.Find.findLatest(repo: String)