操作后重定向到上一页的模式

时间:2013-07-01 14:06:13

标签: scala redirect playframework playframework-2.1

在我的Play应用中,我有几个可以从不同页面触发的操作(例如“删除”实体)。触发操作后,我想在执行操作之前将用户重定向回他们所在的页面。 Play中有没有一个好用的模式?

3 个答案:

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