在我的Play应用中,我有几个可以从不同页面触发的操作(例如“删除”实体)。触发操作后,我想在执行操作之前将用户重定向回他们所在的页面。 Play中有没有一个好用的模式?
答案 0 :(得分:4)
您可以在模板中轻松使用@request.getHeader("referer")
,例如,如果您有一个取消按钮,可以将您重定向到上一页,请使用:
<a href="@request.getHeader("referer")">Cancel</a>
通过这种方式,您无需将任何额外信息传递给模板。 (用游戏2.3.4测试)
答案 1 :(得分:2)
这是我最终提出来的,虽然它不是特别优雅,但我会对更好的方法感兴趣。我使用当前页面URL为表单添加了一个隐藏的输入:
@(implicit request: RequestHeader)
...
<form action="@routes.Controller.doStuff()" method="post">
<input type="hidden" name="previousURL" value="@request.uri"/>
...
</form>
然后在我的控制器中:
def doStuff() = Action { implicit request =>
val previousURLOpt: Option[String] =
for {
requestMap <- request.body.asFormUrlEncoded
values <- requestMap.get("previousURL")
previousURL <- values.headOption
} yield previousURL
previousURLOpt match {
case Some(previousURL) =>
Redirect(new Call("GET", previousURL))
case None =>
Redirect(routes.Controller.somewhereElse)
}
}
答案 2 :(得分:1)
我发现这样做的最简单方法是在你的控制器方法中,使用它:
String refererUrl = request().getHeader("referer");
所以,你可以这样做:
public static Result query(String queryStr, int page, int offset) {
String refererUrl = request().getHeader("referer");
Logger.info("refererUrl: " + refererUrl);
if(queryStr.length() < 3) {
flash(Application.FLASH_ERROR_KEY, "type a longer search than '" + queryStr.trim() + "'");
return redirect(refererUrl);
}
return ok(listings.render(searchService.searchListings(queryStr)));
}
请记住,您需要使用flash消息执行重定向()而不是render()。