将html表单操作绑定到带有一些参数的控制器方法

时间:2015-09-22 16:59:19

标签: forms playframework controller action

在我的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方法在我的控制器中没有参数的情况下,这样做的正确方法是什么?

4 个答案:

答案 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)