方法参数从视图传递到控制器播放框架

时间:2013-03-26 14:16:41

标签: playframework-2.0

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

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

将字符串作为参数并将此字符串传递给模型方法 searchByAddress 。通过address方法搜索返回作为查询结果的模型对象列表。然后将其用于填充表单。

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> 
    }

1 个答案:

答案 0 :(得分:5)

使用:

@routes.Application.searchJourney(arg)

而不是

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

BTW,你为什么要在onsubmit属性中设置它?为此目的使用普通表格action不是更好吗?

修改

Ach,现在我理解你不能使用未声明的参数构建反向路由,或者以HTML形式来自用户输入的参数。 必须存在于视图呈现的那一刻,并且必须具有一些价值。

要获取您显示的内容(http://domain.tld/search?arg=valval来自用户的输入,您需要使用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);
    );
}