我的应用程序控制器中有这个方法:
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>
}
答案 0 :(得分:5)
使用:
@routes.Application.searchJourney(arg)
而不是
@routes.Application.searchJourney("@arg")
BTW,你为什么要在onsubmit
属性中设置它?为此目的使用普通表格action
不是更好吗?
修改强>
Ach,现在我理解你不能使用未声明的参数构建反向路由,或者以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);
);
}