2013-07-01 20 views
8

在我的Play應用程序中,我有幾個可以從不同頁面觸發的動作(例如「刪除」一個實體)。觸發操作後,我想將用戶重定向到執行操作之前所在的頁面。在Play中使用這種模式有什麼好處?在動作後重定向到上一頁的模式

+0

您是否在尋找比通過request.getHeader檢索引用者並將其存儲在閃存或會話中更好的東西?我也希望聽到更好的方法。更新:剛剛意識到你問了斯卡拉。 –

+0

@alihaider我粘貼了我在下面使用的解決方案,但也許使用引用者會更好? –

+0

參見http://stackoverflow.com/questions/14891988/redirect-to-referer-after-a-post-request –

回答

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

,你可以很容易地使用@request.getHeader("referer")在你的模板,例如,如果你有一個取消按鈕這應該重定向到前一頁,使用此:

<a href="@request.getHeader("referer")">Cancel</a> 

以這種方式,您不需要傳遞任何額外的信息到您的模板。 (與遊戲測試2.3.4)

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

請記住,您需要做一個重定向(),而不是一個渲染()與閃光消息。