2

我的应用程序控制器中有这个方法:

public static Result searchJourney(String address) {
    return ok(
        views.html.searchResults.render(Journey.searchByAddress(address),journeyForm)
        );
}

它将字符串作为参数并将此字符串传递给模型方法searchByAddress。按地址搜索方法返回我的模型对象列表,这些对象是查询的结果。然后将其用于填充表单。

public static List<Journey> searchByAddress(String address) {
    return find.where().ilike("start_loc", "%"+address+"%").findList();
}

我遇到的问题是从视图表单中获取地址参数。这是视图的样子:

@main("Journey Search", "search") {
<body>  
        <form>     
        Search for journeys starting in a town/city:
        <input type="text" name="arg"></br>
        <input type="submit" onsubmit="@routes.Application.searchJourney("@arg")" value="Search">
        </form>
    }

所有路由都按预期工作,但我似乎无法将此参数传递给控制器​​方法。当我在文本框中输入一个值时,URL 会更新以显示我的输入:

http://localhost:9000/search?arg=testvalue

但是结果页面永远不会像我预期的那样呈现。

更新:

<form action="@routes.Application.searchJourney(arg)">     

    Search for journeys starting in a town/city:
    <input type="text" name="arg"></br>
    <input type="submit" value="Search">
    </form>

如果 arg 周围没有引号和 @ 符号,我会收到not found: value arg错误消息。

要呈现的结果 HTML

@(listJourneys: List[Journey], journeyForm: Form[Journey])

  @import helper._

  @main("Search Results", "search") {
      <h1>Search Results</h1>
      <table class="table table-hover">
        <thead>
            <tr>
            <th>#</th>
            <th>Starting Location</th>
            <th>End Location</th>
            <th>Participant Type</th>
            <th>Date</th>
            <th>Time</th>
            <!--<th>User</th>-->
             </thead>
              <tbody>
            </tr>

          @for(journey <- listJourneys) {
                <tr>
                  <td>@journey.id</td>
                  <td>@journey.start_loc</td>
                  <td>@journey.end_loc</td>
                  <td>@journey.participant_type</td>
                  <td>@journey.date</td>
                  <td>@journey.time</td>
                </tr>
          }
              </tbody>
      </table> 
    }
4

1 回答 1

5

利用:

@routes.Application.searchJourney(arg)

代替

@routes.Application.searchJourney("@arg")

顺便说一句,你为什么将它设置在onsubmit属性中?action为此目的使用通用形式不是更好吗?

编辑

啊,现在我明白了,一般来说,您不能使用未声明的参数或来自用户以 HTML 形式输入的参数来构建反向路由。它们必须存在于视图渲染的时刻,并且必须具有一定的价值。

为了从用户输入中获取您显示的 ( http://domain.tld/search?arg=val) ,val您需要使用带有arg可选参数的路由和一些默认值(在您的情况下,空字符串很可能是好的:

GET  /search      controllers.Application.searchJourney(arg: String ?= "") 

行动:

public static Result searchJourney(String arg) {
    return ok(
        searchResults.render(Journey.searchByAddress(arg),journeyForm);
    );
}

然后您需要将action表单设置为此路由arg,并将其方法设置为get

<form action="@routes.Application.searchJourney()" method="get">
   ...
</form>

您也可以不在路由中设置任何参数:

GET   /search      controllers.Application.searchJourney
or
POST  /search      controllers.Application.searchJourney

然后使用示例DynamicForm来绑定请求中的字段:

public static Result searchJourney() {
    String arg = form().bindFromRequest.get("arg");
    // perform some basic validation here
    return ok(
        searchResults.render(Journey.searchByAddress(arg),journeyForm);
    );
}
于 2013-03-26T14:30:49.147 回答