2012-09-08 1 views
6

sto usando JSF e primefaces e la mia domanda è:JSF ViewParam da CommandButton

Ho una pagina (page1.jsf) che inviata una param vista con una lista di stringhe (spazio delimitato):

<f:metadata> 
<f:viewParam name="list" value="#{bean1.list}" converter="listConverter"/> 
</f:metadata> 

Il listConverter converte la stringa in un elenco di singole parole. Se accedo alla pagina tramite url (ad esempio: page1.jsf? List = word1 word2 word3 ") tutto funziona bene!

Ma ora sto cercando di usare un'altra pagina (pagina2.jsf) per creare quell'elenco . di termini sto usando un primefaces DataTable, seguendo questo esempio: http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf

voglio tomake possibile per l'utente di selezionare più righe (casella primefaces esempio) e poi premere un pulsante che reindirizza a page1.jsf e passa anche l'elenco degli elementi selezionati come parametro (ad esempio utilizzando l'esempio di vetrina Primeface, passa un elenco dei modelli di auto selezionati)

Sto provando a fare t la sua:

<p:commandButton action="page1?faces-redirect=true&amp;includeViewParams=true" > 
<f:attribute name="list" value="#{bean2.convertSelectedItemsToString()}" /> 
</p:commandButton> 

o questo:

<p:commandButton action="page1?faces-redirect=true&amp;includeViewParams=true" > 
<f:param name="list" value="#{bean2.convertSelectedItemsToString()}" /> 
</p:commandButton> 

dove bean2 ha un selectedItems [] con gli oggetti selezionati.

Inutile dire che non funziona.

Qualsiasi aiuto? Grazie in anticipo.

risposta

7

Un pulsante di comando non utilizza un attributo o un parametro per costruire l'URL a cui avviene il reindirizzamento.

Per questo si utilizza normalmente lo h:commandLink o facoltativamente lo h:outputLink, ma è necessario essere consapevoli che questi renderanno i parametri come erano al momento in cui la pagina è stata richiesta. Se l'utente apporta modifiche dopo la selezione, quelle non si rifletteranno sul link.

Un'alternativa che offre l'ultima selezione, utilizza un metodo di azione e crea l'URL di reindirizzamento lì.

E.g.

<p:commandButton action="#{bean2.navigateWithSelection}" /> 

E poi nel bean:

public String navigateWithSelection() { 
    return "page1?faces-redirect=true&" + convertSelectedItemsToString(); 
} 

Come per i commenti, se bean2 è un fagiolo generico che non è a conoscenza circa la pagina, è possibile passare alla pagina di destinazione come parametro:

<p:commandButton action="#{bean2.navigateWithSelection('page1')}" /> 

E poi nel chicco di nuovo:

+0

Come soluzione temporanea sono andato al tuo secondo approccio. Ma non mi piace, perché in questo modo il mio controller (bean) è fortemente dipendente dalle mie opinioni. Mi aspettavo che jsf mi avrebbe fornito una soluzione migliore. – userk

+0

In JSF un bean di supporto è per convenzione "presunto" per eseguire il back di una singola vista, in modo tale che il backing bean possa essere dipendente dalla vista. Non è 'bean2.convertSelectedItemsToString' mostra già una vista specifica, o stai facendo qualcosa di generico lì? Se hai bisogno di una soluzione generica potresti passare nella pagina come parametro. Vedi risposta aggiornata. –

+0

Questa è una soluzione intelligente! Lo farò! Grazie. – userk