2013-07-01 2 views
8

Nella mia app Play, ho diverse azioni (ad esempio "Elimina" un'entità) che possono essere attivate da pagine diverse. Dopo l'attivazione dell'azione, vorrei reindirizzare l'utente alla pagina in cui si trovavano prima che eseguissi l'azione. C'è un buon modello da usare per questo in Play?Pattern per il reindirizzamento alla pagina precedente dopo un'azione

+0

stai cercando qualcosa di meglio che recuperare il referer tramite request.getHeader e archiviarlo in flash o in sessione? Sarei interessato a conoscere anche i modi migliori. Aggiornamento: appena realizzato hai chiesto informazioni su scala. –

+0

@alihaider Ho incollato la soluzione che ho usato sotto, ma forse usare il referrer sarebbe stato meglio? –

+0

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

risposta

2

Questo è quello che ho inventato alla fine, anche se non è particolarmente elegante, e sarei interessato a modi migliori per farlo. Ho aggiunto un input nascosto alla mia forma con l'URL della pagina corrente:

@(implicit request: RequestHeader) 

... 

<form action="@routes.Controller.doStuff()" method="post"> 
    <input type="hidden" name="previousURL" value="@request.uri"/> 
    ... 
</form> 

Poi, nel mio controller:

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

da poter usare facilmente @request.getHeader("referer") nei modelli, ad esempio, se si dispone di un pulsante di annullamento che dovrebbe favore usare pagina precedente, utilizzare questo:

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

in questo modo, non è necessario passare qualsiasi informazione in più per i modelli. (Testato con il gioco 2.3.4)

1

Il modo più semplice che ho trovato per fare questo, è all'interno del tuo metodo di controllo, utilizzare questo:

String refererUrl = request().getHeader("referer"); 

Quindi, devi fare qualcosa di simile:

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

Ricordare che è necessario eseguire un reindirizzamento() e NON un rendering() con un messaggio flash.

Problemi correlati