2012-09-08 27 views
6

estoy usando JSF y Primefaces y mi pregunta es:JSF ViewParam de CommandButton

Tengo una página (page1.jsf) que recive una vista parámetro con una lista de cadenas (espacio delimitado):

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

listConverter convierte la cadena en una lista de palabras individuales. Si tengo acceso a la página a través de url (por ejemplo: page1.jsf? List = word1 word2 word3 ") todo funciona bien!

Pero ahora estoy tratando de usar otra página (page2.jsf) para crear esa lista . de términos estoy usando un primefaces DataTable, siguiendo este ejemplo: http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf

Quiero tomake posible al usuario seleccionar múltiples filas (casilla ejemplo primefaces) y luego presione un botón que redirigirá a page1.jsf y también pasa la lista de elementos seleccionados como parámetro (por ejemplo, usando el ejemplo de presentación de Primeface, pase una lista de los modelos de automóviles seleccionados).

Estoy tratando de hacer t su:

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

o esto:

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

donde Bean2 tiene un [] selectedItems con los objetos seleccionados.

No hace falta decir que ... No funciona.

¿Algún ayuda? Gracias de antemano.

Respuesta

7

Un botón de comando no usa un atributo o parámetro para construir la URL a la que ocurre la redirección.

Para esto normalmente usa el h:commandLink u opcionalmente el h:outputLink, pero debe tener en cuenta que estos mostrarán los parámetros tal como estaban en el momento en que se solicitó la página. Si el usuario realiza cambios en la selección después de eso, esos no se reflejarán en el enlace.

Una alternativa que le daría la última selección, está usando un método de acción y construye la URL de redireccionamiento allí.

E.g.

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

Y luego, en el bean:

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

De acuerdo con los comentarios, si bean2 es un grano genérico que no tiene conocimiento acerca de la página, puede pasar en la página de destino como parámetro:

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

Y luego, en el bean de nuevo:

+0

Como una solución temporal fui su segundo enfoque. Pero no me gusta, porque de esa forma mi controlador (bean) depende en gran medida de mis puntos de vista. Esperaba que jsf me proporcionara una mejor solución. – userk

+0

En JSF, un bean de respaldo es, por convención, "supuestamente" respaldado por una sola vista, de modo que el bean de respaldo puede verse dependiente. No es 'bean2.convertSelectedItemsToString' ya tiene una vista específica, o estás haciendo algo genérico allí? Si necesita una solución genérica, puede pasarla como parámetro. Ver respuesta actualizada. –

+0

¡Es una solución inteligente! ¡Yo haré eso! Gracias. – userk

Cuestiones relacionadas